【问题标题】:Clarification of recursive calls in binary tree澄清二叉树中的递归调用
【发布时间】:2018-02-02 20:07:25
【问题描述】:

有人可以澄清递归调用以解决此问题吗:

给定一棵仅包含 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

谁能解释我的方法有什么问题?

【问题讨论】:

  • “解决方案”与问题不符。 24 不是从根到叶的数字,但124 是。
  • 从根到叶的路径也拼写为 124 和 125,您的实际结果和预期结果都是关闭的。
  • 那么node.left == null || node.right == null 案例呢?
  • @alain 结果是否等于 124+125+13?
  • 我会说是的。

标签: algorithm recursion tree


【解决方案1】:

试试这个(但我也更喜欢 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】:

    问题是您缺少中间节点数据和 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)
    }
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2015-07-25
      • 2016-04-19
      • 2014-03-29
      • 1970-01-01
      • 2010-12-07
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      相关资源
      最近更新 更多