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

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

94Binary Tree Inorder TraversalTreesEasyTrees

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

Example:

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

Intuition

TIP

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

Approaches

1. Recursive DFS — O(n) / O(h)
  • Idea: 遞迴先走左子樹,再加入當前節點值,最後走右子樹
  • Time: O(n),每個節點訪問一次
  • Space: O(h),遞迴堆疊深度,h 為樹高
class Solution {
    fun inorderTraversal(root: TreeNode?): List<Int> {
        val result = mutableListOf<Int>()
        fun dfs(node: TreeNode?) {
            if (node == null) return
            dfs(node.left)
            result.add(node.`val`)
            dfs(node.right)
        }
        dfs(root)
        return result
    }
}
⭐ 2. Iterative with Stack — O(n) / O(h)
  • Idea: 用 Stack 模擬遞迴,不斷往左走到底,再回頭處理節點並轉向右子樹
  • Time: O(n)
  • Space: O(h)
class Solution {
    fun inorderTraversal(root: TreeNode?): List<Int> {
        val result = mutableListOf<Int>()
        val stack = ArrayDeque<TreeNode>()
        var curr = root
        while (curr != null || stack.isNotEmpty()) {
            while (curr != null) {
                stack.addLast(curr)
                curr = curr.left
            }
            curr = stack.removeLast()
            result.add(curr.`val`)
            curr = curr.right
        }
        return result
    }
}

🔑 Takeaways