1. 程式人生 > 實用技巧 >LeetCode145-二叉樹的後序遍歷

LeetCode145-二叉樹的後序遍歷

非商業,LeetCode連結附上:

https://leetcode-cn.com/problems/binary-tree-postorder-traversal/

進入正題。

題目:

給定一個二叉樹,返回它的後序遍歷。

示例:

示例1:

輸入: [1,null,2,3]  
   1
    \
     2
    /
   3 

輸出: [3,2,1]

程式碼實現:

//節點
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }
}

//方法一 遞迴
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {

        List<Integer> res = new ArrayList<>();
        postOrder(root, res);
        return res;
    }

    public void postOrder(TreeNode root, List<Integer> res) {
        
        if(root == null) {
            return;
        }
        postOrder(root.left, res);
        postOrder(root.right, res);
        res.add(root.val);
    }
}
//時間複雜度O(n),空間複雜度O(n)

//方法二 迭代
class Solution {

    public List<Integer> postorderTraversal(TreeNode root) {

        LinkedList<Integer> res = new LinkedList<>();
        Deque<TreeNode> stack = new LinkedList<>();

        if(root == null) {
            return res;
        }

        stack.add(root);
        while (!stack.isEmpty()) {

            TreeNode node = stack.pollLast();
            res.addFirst(node.val);

            if(node.left != null) {
                stack.add(node.left);
            }
            if(node.right != null) {
                stack.add(node.right);
            }
        }
        return res;
    }
}
//時間複雜度O(n),空間複雜度O(n)

分析:

二叉樹的前序遍歷就是按“左-右-中”的順序遍歷所有的節點;

二叉樹的遍歷,遞迴需要更抽象的思考,怎樣設定結束條件,如何“遞”、怎麼“歸”;

迭代的方法利用連結串列的pollLast()和addFirst()方法,將後得到的節點新增到更前面。先右子樹,後左子樹的順序。

--End