澄清二叉树中的递归调用

时间:2017-08-24 20:11:16

标签: algorithm recursion tree

有人可以提供解决此问题的递归调用的说明:

  

给定一个二进制树,其中只包含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

有人能解释我的做法有什么问题吗?

2 个答案:

答案 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)
}

希望它有所帮助!

相关问题