Medium草稿★★★★★O(n) 時間 · O(n) 空間
TreeDFS
Patterns🌳 樹形 DFS
尚未複習過

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

129Sum Root to Leaf NumbersTreesMediumTrees

給定一棵二元樹,每個節點值為 0-9。每條根到葉的路徑代表一個數字(如 1->2->3 代表 123)。回傳所有根到葉數字的總和。

Example:

Input: root = [1,2,3] Output: 25 Explanation: 12 + 13 = 25

Intuition

TIP

DFS 往下傳遞當前累積的數字,到葉節點時加入總和。

Approaches

1. DFS Recursive — O(n) / O(h)
  • Idea: 遞迴傳遞當前累積的數字,到葉節點時回傳
  • Time: O(n)
  • Space: O(h),h 為樹高
class Solution {
    fun sumNumbers(root: TreeNode?): Int {
        return dfs(root, 0)
    }

    private fun dfs(node: TreeNode?, currentNum: Int): Int {
        if (node == null) return 0
        val num = currentNum * 10 + node.`val`
        if (node.left == null && node.right == null) return num
        return dfs(node.left, num) + dfs(node.right, num)
    }
}
⭐ 2. BFS Iterative — O(n) / O(n)
  • Idea: 用佇列做 BFS,每個節點存當前累積的數字,到葉節點時加入總和
  • Time: O(n)
  • Space: O(n)
class Solution {
    fun sumNumbers(root: TreeNode?): Int {
        if (root == null) return 0
        var sum = 0
        val queue: Queue<Pair<TreeNode, Int>> = LinkedList()
        queue.offer(root to root.`val`)
        while (queue.isNotEmpty()) {
            val (node, num) = queue.poll()
            if (node.left == null && node.right == null) {
                sum += num
                continue
            }
            node.left?.let { queue.offer(it to num * 10 + it.`val`) }
            node.right?.let { queue.offer(it to num * 10 + it.`val`) }
        }
        return sum
    }
}

🔑 Takeaways