有时候,路径未必非得从根节点开始。
题目链接:
二叉树中的最大路径和 - 力扣(LeetCode)leetcode-cn.com题目描述:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/
9 20
/
15 7
输出: 42
解题思路:
本题中的最大和路径未必从根节点开始,但是我们可以分而治之。
最大路径和可能出现在三种情况中:
- 左子树
- 右子树
- 根节点与左右子树
实现的时候仍然是DFS递归就好了,有一点需要注意的是,函数返回值和求最大路径和之间计算的差异。
在递归的过程中,函数返回的是此节点与左右子树中最大值的和(想往上的话只能选择左右子树当中的一支,所以是root->val +max(l,r)),小于0或较小的解直接被舍弃,不会再被用到。
在这个过程中,最大值maxsum会不断更新,与其比较的是当前节点与其左右子树最大值之和(求最大路径和的时候可以包含左右子树,所以是l+r+root->val)。
代码如下:
class Solution {
public:
int maxPathSum(TreeNode* root) {
int maxsum = INT_MIN;
dfs(root, maxsum);
return maxsum;
}
int dfs(TreeNode* root, int& maxsum){
if(!root) return 0;
int l = dfs(root->left, maxsum); // 右边最大值
int r = dfs(root->right, maxsum); // 左边最大值
maxsum = max(l+r+root->val, maxsum); // 和当前最大值比较
return max(0, root->val + max(l,r)); // 剪枝掉所有小于0的路径
}
};
如果有任何疑问,欢迎提出。如果有更好的解法,也欢迎告知。