Easy草稿★★★★★O(n) 時間 · O(n) 空間
TreeDFSStackPostorder
Patterns🌳 樹形 DFS🥞 堆疊
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

145Binary Tree Postorder TraversalTreesEasyTrees

給定一棵二元樹的根節點,回傳其後序遍歷 (Postorder Traversal) 的節點值列表。後序遍歷順序為:左子樹 -> 右子樹 -> 根。

Example:

Input: root = [1,null,2,3] Output: [3,2,1]

Intuition

TIP

後序遍歷:先遞迴走左、右子樹,最後才處理當前節點。

Approaches

1. Recursive DFS — O(n) / O(h)
  • Idea: 遞迴先走左子樹,再走右子樹,最後處理當前節點
  • Time: O(n)
  • Space: O(h)
class Solution {
    fun postorderTraversal(root: TreeNode?): List<Int> {
        val result = mutableListOf<Int>()
        fun dfs(node: TreeNode?) {
            if (node == null) return
            dfs(node.left)
            dfs(node.right)
            result.add(node.`val`)
        }
        dfs(root)
        return result
    }
}
⭐ 2. Iterative (reverse preorder) — O(n) / O(n)
  • Idea: 修改前序遍歷為 Root -> Right -> Left,最後將結果反轉即為後序遍歷
  • Time: O(n)
  • Space: O(n),需要存放完整結果後反轉
class Solution {
    fun postorderTraversal(root: TreeNode?): List<Int> {
        val result = mutableListOf<Int>()
        if (root == null) return result
        val stack = ArrayDeque<TreeNode>()
        stack.addLast(root)
        while (stack.isNotEmpty()) {
            val node = stack.removeLast()
            result.add(node.`val`)
            node.left?.let { stack.addLast(it) }
            node.right?.let { stack.addLast(it) }
        }
        return result.reversed()
    }
}

🔑 Takeaways