LeetCode 129 經典題目:給定只含數字 0-9 的二叉樹,每條根到葉路徑代表一個數字,求所有路徑數字之和。
1
/ \
2 3
class Solution {
private:
void dfs(TreeNode* root, int& sum, int& pathVal) {
if (!root) return;
// 更新路徑數值:原值 * 10 + 當前節點值
pathVal = pathVal * 10 + root->val;
// 葉節點:累加到總和
if (!root->left && !root->right) {
sum += pathVal;
}
// 遞歸左右子樹
if (root->left) dfs(root->left, sum, pathVal);
if (root->right) dfs(root->right, sum, pathVal);
// 回溯:恢復路徑數值 (減去當前節點貢獻)
pathVal = (pathVal - root->val) / 10;
}
public:
int sumNumbers(TreeNode* root) {
int sum = 0, pathVal = 0;
dfs(root, sum, pathVal);
return sum;
}
};
路徑 1→2→3 的數值構建過程:
pathVal = 0
→ 節點 1: 0*10+1 = 1
→ 節點 2: 1*10+2 = 12 (葉節點,sum += 12)
→ 回溯: (12-2)/10 = 1
→ 節點 3: 1*10+3 = 13 (葉節點,sum += 13)
→ 回溯: (13-3)/10 = 1
→ 回溯: (1-1)/10 = 0
最終 sum = 25
| 指標 | 複雜度 | 說明 |
|---|---|---|
| 時間 | O(N) | 每個節點訪問一次 |
| 空間 | O(H) | 遞歸棧深度 = 樹高 H,最壞 O(N) |
val = val*10 + digitval = (val - digit)/10sum 累加總和,pathVal 維護當前路徑值!left && !right 確保只在完整路徑結算