所有 Root-Leaf 路徑總和 | Medium | LeetCode#129. Sum Root to Leaf Numbers
題目敘述
- 題目難度:
Medium
- 題目描述:給定一個 Binary Tree 的
root
,樹中的節點值為 0~9 的其中一個數字,從 Root 到 leaf 的節點值可以形成一個整數 (1->2->3
就代表123
),每一條從root到 leaf的路徑都有一個數字,本題需要你將每個數字加總。
題目有提示,回傳的整數會需要為 32-bit 整數
解法
一開始的想法
這次的想法就會是,這種題目就是可以用 dfs 或者是 bfs 來解,這次選用 dfs 並且在每次拜訪節點的時候去紀錄節點值,並且可以再回傳到原先的 caller 的時候將原先的路徑值乘上10 (才能夠形成一個 10 進位數字),然後後夾到當前節點值,一路遞迴回去就能得到某一路徑的加總值。
之後再將所有路徑的和在加總起來回傳就好。
我的解法
1 | /** |
我這裡拆分成兩個函數: dfs
以及題目給得 sumNumbers
也另外定義了兩個變數 sum
以及 pathsum
sum
用於儲存個條路徑總和的加總pathsum
則是在 DFS 過程中儲存節點的加總值
1 | void dfs (TreeNode *current, int pathsum){ |
首先如果遇到 nullptr
就直接返回。而我們在拜訪節點的時候,會去將當前節點值,加上 pathSum
乘上 10,這代表將先前的節點進位並與當前節點值形成數字,並且更新到 pathSum
變數中,接著就是繼續 traverse,在遞迴左右子樹的過程中,一樣將 pathSum
作為參數,再下一次迭代中一樣去更新節點值,形成更大的數字。
可以看下面圖解
執行結果
複雜度
時間複雜度
用 DFS 遍歷了每個節點,因此是 $O(N)$,N 為節點數量。
空間複雜度
遞迴時候的 call stack 會與樹的形狀有關,最壞狀況會是 $O(N)$,如果是平衡樹就會是 $O(LogN)$
sum
或者 pathSum
等變數就是常數級別的複雜度,因此整體而言空間複雜度為 $O(N)$
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Kevin Liu's 部落格 || Technical || Travel!
評論