有人可以提供解决此问题的递归调用的说明:
给定一个二进制树,其中只包含0-9的数字,每个根到叶 路径可以代表一个数字。找出所有root-to-leaf的总和 号。
例如,对于这棵树:
1
/ \
2 3
/ \
4 5
结果应该等于12 + 13 + 24 + 25
此问题的递归解决方案是:
public int sum(TreeNode root) {
return helper(root, 0);
}
private int helper(TreeNode node, int sum){
if(node == null) return 0;
sum = sum * 10 + node.val;
if(node.left == null && node.right == null) return sum;
return helper(node.left, sum) + helper(node.right, sum);
}
我正在尝试跟踪方法helper
的所有递归调用,并计算每一步的总和值。
例如,在第一步变量sum
等于0 * 10 + 1 = 1.然后我们在该步骤上调用helper(node.left, 1)
和sum
等于1 * 10 + 2 = 12
。然后我们在该步骤上调用helper(node.left, 12)
和sum
等于12 * 10 + 4 = 124
,这显然不正确,因为sum
应为24
。
有人能解释我的做法有什么问题吗?
答案 0 :(得分:0)
尝试这个(但我也更喜欢124 + 125 + 13):
public int sum(TreeNode root) {
if (root == null) return 0;
return sum(root, 0);
}
private int sum(TreeNode node, int parentValue){
if(node == null) return 0;
return sum(node.left, node.val) + sum(node.right, node.val) + parentValue * 10 + node.val;
}
答案 1 :(得分:0)
问题是您缺少中间节点数据和2位数据限制。
删除'if(node.left == null&& node.right == null)return sum;',仅将父节点值发送到递归调用并添加当前节点数据。
DoctorLOL的解决方案几乎是正确的,您可能希望添加忽略根节点数据代码。以下代码可能有所帮助。
public int sum(TreeNode root) {
return helper(root, -1);
}
private int helper(TreeNode node, int parentValue){
if(node == null) return 0;
if (parentValue != -1)
return helper(node.left, node.val) + helper(node.right, node.val) + parentValue * 10 + node.val;
else
return helper(node.left, node.val) + helper(node.right, node.val)
}
希望它有所帮助!