给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不需要经过根节点。
示例 1:
输入: [1,2,3]
1
/
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/
9 20
/
15 7
输出: 42
这道题目的思路是深度优先搜索,每个节点当前的值加上左子树里最大单路径值加上右子树最大单路径值,就是此节点的最大路径和,但是当前节点要返回给上一级节点的可不是此节点的最大路径和,因为必须是单路径的,所以我们return值是当前节点值加上左右子树最大的那段单路径值,这样递归下来,每一个节点都有属于他自己的最大路径值,找到这些节点最大的,就是我们的答案!!
代码如下:
public class LeetCode124 { public int maxSum; public static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public int maxPathSum(TreeNode root) { if (root == null) { return 0; } if (root.left == null && root.right == null) { return root.val; } maxSum = root.val; getSum(root); return maxSum; } private int getSum(TreeNode root) { // 这里我们第一行不是判断边界条件 int curVal = root.val; int lSum = 0; int rSum = 0; if (root.left != null) { lSum = getSum(root.left); } if (root.right != null) { rSum = getSum(root.right); } // 叶子节点或者是执行完了左右子树的节点 // 拿到左右子树最大的那个路径,加上自己的值,看是否大于maxSum int value = curVal + (lSum > 0 ? lSum : 0) + (rSum > 0 ? rSum : 0); if (value > maxSum) { maxSum = value; } return curVal + Math.max(lSum > 0 ? lSum : 0, rSum > 0 ? rSum : 0); } }