难度困难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
|
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的步骤表示如果有一边是负的那么就不做贡献,和空节点没有区别;