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

难度困难510

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

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

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

//用一个maxm来缓存对于某一个根节点的状态;
//dfs过程中返回给上层应该是最大的一边;
class Solution {
public:
int maxm=INT_MIN;
int dfs(TreeNode*root){
if(root==nullptr){
return 0;
}
int left=max(0,dfs(root->left));
int right=max(0,dfs(root->right));
maxm=max(maxm,root->val+left+right);
return max(left+root->val,right+root->val);

}
int maxPathSum(TreeNode* root) {
//
dfs(root);
return maxm;
}
};

dfs解决该题,使用maxm缓存最大的结点处于的状态;dfs到某一个结点的时候,该节点返回给上一层:该节点值,该结点值+左值,该节点的值+右值的最大值;

对于空节点,返回0,表示对原来的结点没有贡献;

对于负值,和0比较取max的步骤表示如果有一边是负的那么就不做贡献,和空节点没有区别;