二叉樹節點值 0-9,每條根到葉路徑代表一個數字(如 1→2→3 代表 123)。求所有路徑數字之和。
例:
1
/ \
2 3
路徑:12 + 13 = 25。
遞歸參數:當前節點、累積值引用、結果引用。到葉節點時將累積值加入結果。回溯時恢復累積值。
#include
struct TreeNode {
int val;
TreeNode *left, *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
void dfs(TreeNode* root, int& result, int& cur) {
if (!root) return;
cur = cur * 10 + root->val; // 更新累積值
if (!root->left && !root->right) // 葉節點
result += cur;
if (root->left) dfs(root->left, result, cur);
if (root->right) dfs(root->right, result, cur);
cur = (cur - root->val) / 10; // 回溯恢復
}
public:
int sumNumbers(TreeNode* root) {
int result = 0, cur = 0;
dfs(root, result, cur);
return result;
}
};
int sumNumbers(TreeNode* root) {
if (!root) return 0;
int sum = 0;
stack> st;
st.push({root, root->val});
while (!st.empty()) {
auto [node, val] = st.top(); st.pop();
if (!node->left && !node->right) sum += val;
if (node->right) st.push({node->right, val*10 + node->right->val});
if (node->left) st.push({node->left, val*10 + node->left->val});
}
return sum;
}
cur = cur * 10 + val!left && !rightcur = (cur - val) / 10(整數除法)