94. Binary Tree Inorder Traversal

递归的代码是以前数据结构书上常见的:

    public ArrayList inorderTraversal(ConstructBinaryTreefromPostorderandInorderTraversal.TreeNode root) {
        ArrayList res = new ArrayList<>();
        dfs(res, root);
        return res;
    }

    private void dfs(List res, ConstructBinaryTreefromPostorderandInorderTraversal.TreeNode node) {
        if (node == null) return;
        dfs(res, node.left);
        res.add(node.val);
        dfs(res, node.right);
    }

非递归用stack模拟中序遍历,要理解啊,不能死记硬背。注意while条件和while里面的if。

public class Solution {
        public ArrayList inorderTraversal(TreeNode root) {
            ArrayList res = new ArrayList<>();
            LinkedList stack = new LinkedList<>();
            //注意while条件是或
            while (root != null || !stack.isEmpty()){
                if (root!=null){
                    stack.push(root);
                    root = root.left;
                }else {
                    root = stack.pop();
                    res.add(root.val);
                    root = root.right;
                }
            }
            return res;
        }
}

MAR 25TH
这题今天做98. Validate Binary Search Tree 的时候又来复习了一遍,又忘的差不多了。。记得当时还在考虑为什么while里面要用||而不是&&。

这题还可以这样写:

public List inorderTraversal(TreeNode root) {
    List list = new ArrayList<>();
    if(root == null) return list;
    Stack stack = new Stack<>();
    while(root != null || !stack.empty()){
        while(root != null){
            stack.push(root);
            root = root.left;
        }
        root = stack.pop();
        list.add(root.val);
        root = root.right;
        
    }
    return list;
}

JULY 29 REVIEW

又看了一遍迭代的方法,仍然写不出。。上面那个代码,两个while循环其实挺清晰的,但是root = root.right那边还是挺难想到的。还有就是外层的while,两种情况;1是root!= null的情况,这种比较好考虑,就是首次进入的时候;2是root==null的情况,statck不为空,这种就是dfs到栈最底的情况。

你可能感兴趣的:(94. Binary Tree Inorder Traversal)