二叉树的中序遍历,递归很好写,但是用迭代要怎么写呢?
迭代就是知道了初始条件之后一步步往下推,获得新的条件,继续推。
这道题需要用栈储存信息
我想到的需要标记它是否访问过,但是我不会改leetcode里面结构体的definition,自己电脑上也还没配leetcode环境【对我一直在它的网页里写题TvT】就先把代码放在这,回头来再试试
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* bool vis;
* TreeNode(int x) : val(x), left(NULL), right(NULL), vis(false) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode *> s;
s.push(root);
vector<int> ans;
while (!s.empty())
{
TreeNode *t = s.top();
t->vis = true;
while (t->left && t->left->vis == false)
{
s.push(t->left);
t = t->left;
}
ans.push_back(t->val);
s.pop();
if (t->right)
{
s.push(t->right());
}
}
return ans;
}
};
题解给的代码是这样的
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* bool vis;
* TreeNode(int x) : val(x), left(NULL), right(NULL), vis(false) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode *> s;
vector<int> ans;
TreeNode *t = root;
while (!s.empty() || t != NULL)
{
while (t)
{
s.push(t);
t = t->left;
}
t = s.top();
ans.push_back(t->val);
s.pop();
t = t->right;
}
return ans;
}
};
精髓就是最后一句t = t->right;
这样它如果没有右子树,while(t)
就会直接跳过,太妙了,为什么我自己想不到呢?
看题解上还有一种O(1)的算法,今天真的累了TvT改天吧