94. Binary Tree Inorder Traversal

naive级别递归三连其二:中序遍历。

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

public void dfs(TreeNode root, List<Integer> res) {
    if (root == null) return;

    dfs(root.left, res);
    res.add(root.val);
    dfs(root.right, res);
}

递归的理解:同样先写出三个点的中序遍历,然后发现迷之缩进里的两个左右子树的if可以用dfs复用。

public void dfs(TreeNode root, List<Integer> res) {
    if (root == null) return;
        // 左边的坑:dfs(root.left, res);
        if (root.left == null) return;
        res.add(root.left.val);
    res.add(root.val);
        // 右边的坑:dfs(root.right, res)
        if (root.right == null) return;
        res.add(root.right.val);
}

注意不要用Stack。中序遍历的栈实现中有一个指针,一开始栈为空,或者有时候栈空的时候指针还指着下一个点,如[1,null,2,3],所以判断条件为是栈不为空或者指针不为空。

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    Deque<TreeNode> stack = new ArrayDeque<>();
    TreeNode node = root;

    while (!stack.isEmpty() || node != null) {
        while (node != null) {
            stack.push(node);
            node = node.left;
        }
        node = stack.pop();
        res.add(node.val);
        node = node.right;
    }
    return res;
}

results matching ""

    No results matching ""