1. 程式人生 > >LeetCode0145.二叉樹的後序遍歷

LeetCode0145.二叉樹的後序遍歷

0145.二叉樹的後序遍歷

描述

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

例項

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

輸出: [3,2,1]

進階

遞迴演算法很簡單,你可以通過迭代演算法完成嗎?

題解

後序遍歷時,有如下幾種情況

  • root為葉子結點 ➡️直接訪問
  • root為非葉子節點,但子節點未被訪問 ➡️將root的右左孩子依次進棧
  • root為非葉子節點,且子節點未被訪問 ➡️直接訪問 該情況有以下可能
    • root有且只有左孩子,且左孩子為上一個訪問的節點
    • root有右孩子,且右孩子為上一個訪問的節點(實現是,由於pre初始化null有可能root.right == null == pre因此,需要加上條件為此時pre!= null
    public static List<Integer> postorderTraversal(TreeNode root) {
        TreeNode pre = null;
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> result =
new ArrayList<>(); if (root == null) return result; stack.push(root); while (!stack.isEmpty()){ root = stack.peek(); if (root == null){ stack.pop(); continue; } //root為葉子結點,直接訪問
if (root.right == null && root.left == null){ root = stack.pop(); pre = root; result.add(root.val); continue; } //root為非葉子結點,但是子節點已經被訪問過,直接訪問 //root只有左孩子且pre==root.left //或者root有右孩子且pre == root.right,此時pre不能等於null if (((root.right == null) && (pre == root.left)) || ((root.right == pre) && (pre != null))){ root = stack.pop(); pre = root; result.add(root.val); continue; } stack.push(root.right); stack.push(root.left); } return result; }