給定一棵二叉樹,節點值為 0-9。每條從根到葉的路徑代表一個數字(如 1->2->3 代表 123)。求所有路徑數字之和。
遞歸函數 `dfs(node, curSum)` 返回以 node 為根的子樹所有路徑數字和。`curSum` 為從根到父節點構成的數字。
class Solution {
public int sumNumbers(TreeNode root) {
return dfs(root, 0);
}
private int dfs(TreeNode node, int curSum) {
if (node == null) return 0;
curSum = curSum * 10 + node.val;
if (node.left == null && node.right == null) {
return curSum; // 葉節點,返回當前數字
}
return dfs(node.left, curSum) + dfs(node.right, curSum);
}
}
遍歷到葉節點時將當前數字加到全局答案。
class Solution {
int total = 0;
public int sumNumbers(TreeNode root) {
dfs(root, 0);
return total;
}
void dfs(TreeNode node, int curSum) {
if (node == null) return;
curSum = curSum * 10 + node.val;
if (node.left == null && node.right == null) {
total += curSum;
return;
}
dfs(node.left, curSum);
dfs(node.right, curSum);
}
}
public int sumNumbers(TreeNode root) {
if (root == null) return 0;
int sum = 0;
Deque nodeStack = new ArrayDeque<>();
Deque numStack = new ArrayDeque<>();
nodeStack.push(root);
numStack.push(root.val);
while (!nodeStack.isEmpty()) {
TreeNode node = nodeStack.pop();
int cur = numStack.pop();
if (node.left == null && node.right == null) sum += cur;
if (node.right != null) {
nodeStack.push(node.right);
numStack.push(cur * 10 + node.right.val);
}
if (node.left != null) {
nodeStack.push(node.left);
numStack.push(cur * 10 + node.left.val);
}
}
return sum;
}