145. Binary Tree Postorder Traversal

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

public List<Integer> postorderTraversal(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);
    dfs(root.right, res);
    res.add(root.val);
}

递归的理解:写出三个点的后序遍历,然后发现迷之缩进里的两个左右子树的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);
        // 右边的坑:dfs(root.right, res)
        if (root.right == null) return;
        res.add(root.right.val);
    res.add(root.val);
}

后序遍历的栈:和中序遍历不同的是,虽然后序遍历也有个指针,但是它和前序遍历一样是root节点在栈底,所以root一旦进栈,中间过程就不可能是空。

public List<Integer> postorderTraversal(TreeNode root) {
    LinkedList<Integer> res = new LinkedList<>();
    Deque<TreeNode> stack = new ArrayDeque<>();
    if (root != null) stack.push(root);
    TreeNode node = root;

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

当然也可以和中序遍历一样加在判断条件上

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

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

results matching ""

    No results matching ""