Binary Tree Inorder Traversal

二叉树中序遍历的非递归实现
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;
    }
  };

你可能感兴趣的:(算法)