方法一:递归传递curSum
class Solution {
int res = 0;
public int sumNumbers(TreeNode root) {
dfs(root, 0);
return res;
}
public void dfs(TreeNode node, int cur) {
cur = cur * 10 + node.val;
if (node.left == null && node.right == null) {
res = cur + res;
return;
}
if (node.left != null) {//处理一边null一边不null
dfs(node.left, cur);
}
if (node.right != null) {//处理一边null一边不null
dfs(node.right, cur);
}
}
}
或者:
class Solution {
int res = 0;
public int sumNumbers(TreeNode root) {
dfs(root, 0);
return res;
}
public void dfs(TreeNode node, int curSum) {
if (node == null) {
return;
}
curSum = curSum * 10 + node.val;
if (node.left == null && node.right == null) {
res += curSum;
}
dfs(node.left, curSum);
dfs(node.right, curSum);
}
}
方法二:全局变量curSum,回溯
写法1
class Solution {
int curSum = 0;
int res = 0;
public int sumNumbers(TreeNode root) {
dfs(root);
return res;
}
public void dfs(TreeNode node) {
curSum = curSum * 10 + node.val;
if (node.left == null && node.right == null) {
res += curSum;
return;
}
if (node.left != null) {
dfs(node.left);
}
curSum /= 10;
if (node.right != null) {
dfs(node.right);
}
curSum /= 10;
}
}
写法2
class Solution {
int curSum = 0;
int res = 0;
public int sumNumbers(TreeNode root) {
dfs(root);
return res;
}
public void dfs(TreeNode node) {
if (node == null) {
return;
}
curSum = curSum * 10 + node.val;
if (node.left == null && node.right == null) {
res += curSum;
}
dfs(node.left);
dfs(node.right);//左右两个节点都访问完了,才可以撤销
curSum /= 10;
}
}