澄清
问题描述:
可能有人为对这个问题的解决方案提供一种澄清的递归调用:澄清
给出一个包含有从0-9只,每根到叶的数字 的二进制树路径可以代表一个数字。查找所有从根到叶 号码的总和。
例如,对于此树:
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
。
有人能解释我的方法有什么问题吗?
答
试试这个(但我还优选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;
}
答
问题是您缺少的中间节点的数据和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)
}
希望它有帮助!
'解决方案'并不真正符合问题。 '24'不是根到叶的数字,而是'124'。 – alain
根到叶的路径也是拼写124和125,你的实际和预期结果都是关闭的。 –
那么'node.left == null ||怎么样? node.right == null'的情况? –