二叉树最大路径和中的递归调用解释

时间:2017-08-25 03:13:05

标签: algorithm recursion tree

这是问题所在:

  

给定二叉树,找到最大路径总和。

     

对于这个问题,路径被定义为来自某些节点的任何节点序列   沿着父子节点到树中的任何节点的起始节点   连接。该路径必须至少包含一个节点,并且不需要   通过根。

     

例如:给出下面的二叉树,

   1
  / \
 2   3
     

返回6.

此问题的递归解决方案如下所示:

int max = Integer.MIN_VALUE;

public int maxPathSum(TreeNode root) {
    helper(root);
    return max;
}

private int helper(TreeNode root) {
    if (root == null) return 0;
    int left = Math.max(helper(root.left), 0);
    int right = Math.max(helper(root.right), 0);
    max = Math.max(max, root.val + left + right);
    return root.val + Math.max(left, right);
}

我们为左孩子打电话helper并检查左孩子是否大于零。

然后我们给正确的孩子打电话helper并检查右孩子是否大于零。

然后我们使用总和max检查当前root.val + left + right值 - 这也很清楚。

然而,在return语句中,我们只有根值和其中一个孩子的总和。 为什么我们这里只招一个孩子而不是两个孩子,如果他们都是积极的?

1 个答案:

答案 0 :(得分:1)

递归方法不返回解决方案本身,它只返回该部分的最大值。最终解决方案在max变量中计算。

如果检查maxPathSum方法,则返回最大值而不是辅助方法返回的值。

这是因为解决方案可能无法触及根目录,如下所示:

       0
     /   \
    1     0
   / \   / \
  2   3 0   0