题目简介:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
1 2 3 4 5 6 7
| 输入: [1,2,3]
1 / \ 2 3
输出: 6
|
示例 2:
1 2 3 4 5 6 7 8 9
| 输入: [-10,9,20,null,null,15,7]
-10 / \ 9 20 / \ 15 7 输出: 42
|
思路:
对于二叉树中的一个节点,该节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值和,如果子节点的最大贡献值为正,则计入该节点的最大路径和,否则不计入该节点的最大路径和。
同时用maxSum
不断存储过程中的最大路径和,最后返回即可。
tips:
- 利用
max(0, val)
来排除负数的值
root -> val + max(leftVal, rightVal)
的含义是返回经过root
的单边最大分支给上游
maxValue()
函数的作用便是计算一个节点的最大贡献值,具体而言,就是在以该节点为根节点的子树中寻找以该节点为起点的一条路径,使得该路径上的节点值之和最大。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
class Solution { public: int maxSum = INT_MIN;
int maxValue(TreeNode* root){
if(root == NULL) return 0; int leftVal = max(maxValue(root -> left), 0); int rightVal = max(maxValue(root -> right), 0);
int nowVal = root -> val + leftVal + rightVal; maxSum = max(maxSum, nowVal);
return root -> val + max(leftVal, rightVal); }
int maxPathSum(TreeNode* root) {
maxValue(root); return maxSum; } };
|