二叉树中序遍历的非递归实现
Given binary tree like [1,null,2,3],
1
\
2
/
3
return [1,3,2].
二叉树中序遍历这种简单的题目还用写题解,大神饶命,只是想写写遍历的非递归实现,并且实在感觉对我来说有点难度,很难想得出来,想理一理记住了.我等凡人就是如此啊.
递归实现真是有些简单,代码如下:
void Inorder(TreeNode * node,vector<int> &res){
if(node==NULL)return ;
Inorder(node->left,res);
res.push_back(node->val);
Inorder(node->right,res);
}
其实自己举个例子就知道这遍历的过程了. 申请一个栈stack, 申请一个节点指针node指向根节点,好了,我们要开始遍历了.
向树左边玩命遍历,每遍历一个元素将元素放入stack,更新node节点,直到遇到空为止, 下次才弹出栈顶元素(最靠近空指针且未曾遍历过的元素),放入结果集,并将node更新为node右子树索引.继续下次循环.
来看看这么做的本质,其实每次遇到空指针都会触发弹出栈的元素放入结果集,那么这时候弹出的元素一定是下一个中序遍历要输出的元素么,仔细想想,空指针要么是某节点的左子树,要么是节点右子树,
如果空指针是左子树,那么按照栈的push规则,本次弹出的肯定是其父节点,合乎规则.
如果空指针是右子树,那么该节点是上次弹出的元素,记为e,此时栈顶若非空,来讨论e,若e是某直接父节点左子树,本次一定弹出e的亲爹,如果e是右子树,其爹肯定是弹出过了,如果有的话,所以本次弹出应该是爹的爹,如果有的话,合情合理.
终止条件应该是,栈中没有元素并且本次指针还是空的.因为本次需要弹出下一个元素,然而没有了,就该结束了
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res ;
stack st;
// st.push(root);
TreeNode * node =root;
while(!st.empty()||node!=NULL){
if(node!=NULL)
{
st.push(node);
node = node->left;
}else
{
node = st.top();
res.push_back(node->val);
st.pop();
node = node->right;
}
}
return res;
}
};