这是问题所在:
给定二叉树,找到最大路径总和。
对于这个问题,路径被定义为来自某些节点的任何节点序列 沿着父子节点到树中的任何节点的起始节点 连接。该路径必须至少包含一个节点,并且不需要 通过根。
例如:给出下面的二叉树,
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语句中,我们只有根值和其中一个孩子的总和。 为什么我们这里只招一个孩子而不是两个孩子,如果他们都是积极的?
答案 0 :(得分:1)
递归方法不返回解决方案本身,它只返回该部分的最大值。最终解决方案在max变量中计算。
如果检查maxPathSum方法,则返回最大值而不是辅助方法返回的值。
这是因为解决方案可能无法触及根目录,如下所示:
0
/ \
1 0
/ \ / \
2 3 0 0