二叉树中序遍历
中序遍历啊:先左子树再访问根节点最后右子树
例如:
1
/ \
2 3
/\
4 5
中序遍历的访问结果是:4 2 5 1 3
中序遍历有递归做法和迭代做法,迭代做法我们需要手动维护一个系统栈
首先来看看系统栈怎么在中序遍历时被调用的
从root开始走一直到根节点的最左边子树
stk依次保存 1 2 4
此时4无左子树,访问res.push_back(4),无右子树,4被stk弹出
此时访问栈顶元素2,左子树被访问完毕,访问res.push_back(2),2被弹出,此时res有右子树
将右子树当作一颗新的以5为根的二叉树
将其最左边子树压入栈中依次保存 1 5
5没有左子树,访问res.push_back(5),5被弹出 无右子树
访问栈顶元素1,1被弹出,访问右子树,此时1有右子树
将右子树当作一颗新的以3为根的二叉树
将其最左边子树压入栈中依次保存 3
3没有左子树,访问res.push_back(3),3被弹出 无右子树,此时stk为空,循环结束
我们发现每次访问都是取出栈顶元素,并且也是此时的根节点
非递归代码中如何实现的呢
首先观察到结束条件是谁:栈空,如果此时工作节点是空也没必要进行
访问顺序:先最左再取栈顶,再访问右,没结束,工作节点一直向左走,stk一直压栈
以下是非递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> stk;
vector<int> res;
TreeNode * p = root;
while(p || stk.size())
{
while(p)
{
stk.push(p);
p = p->left;
}
p = stk.top();
stk.pop();
res.push_back(p->val);
p = p->right;
}
return res;
}
};
递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> res;
vector<int> inorderTraversal(TreeNode* root) {
digui(root);
return res;
}
void digui(TreeNode * root)
{
if(!root)return;
digui(root->left);
res.push_back(root->val);
digui(root->right);
}
};