[leetcode]Binary Tree Inorder Traversal

二叉树的中序遍历非递归版本,采用的是wiki百科上的办法。果然简洁,而且和先序有异曲同工之妙,先序只用push右节点,中序只用push中节点。除此之外还有个更改TreeNode加一个visited的bool值的办法就不表了。http://discuss.leetcode.com/questions/23/binary-tree-inorder-traversal 这个链接里面有个长长的讨论。后序遍历据说比较难,就先不学了,哪个面试官会这么变态出后序遍历么!!无堆栈版本的遍历也先不学了,有空多写先序和中序,要记熟了。

写的时候仍然要看图,不要光背,思路是:
1.当前节点一直是要处理的节点;
2.不停向左子树方向走,并push本节点;
3.走不下去了(null),就从栈中取刚才那个节点,打印,并变当前节点为右节点。

public class Solution {
    public ArrayList<Integer> inorderTraversal(TreeNode root) {
        ArrayList<Integer> ans = new ArrayList<Integer>();
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode n = root;
        while (n!= null || !stack.empty()) {
            if (n!= null) {
                stack.push(n);
                n = n.left;
            }
            else {
                n = stack.pop();
                ans.add(n.val);
                n = n.right;
            }
        }
        return ans;
    }
}

  

原文地址:https://www.cnblogs.com/lautsie/p/3261119.html