Keshawn_lu's Blog

Leetcode 124. 二叉树中的最大路径和

字数统计: 452阅读时长: 1 min
2020/06/21 Share

题目简介:

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例 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
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxSum = INT_MIN;

int maxValue(TreeNode* root){

if(root == NULL)
return 0; //空节点贡献为0

int leftVal = max(maxValue(root -> left), 0); //大于0才有贡献
int rightVal = max(maxValue(root -> right), 0);

//路径为 left -> root -> right
int nowVal = root -> val + leftVal + rightVal;
maxSum = max(maxSum, nowVal);

//返回经过root的单边最大分支给上游
return root -> val + max(leftVal, rightVal);
}

int maxPathSum(TreeNode* root) {

maxValue(root);
return maxSum;
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: