给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
思路分析:
最长路径有两种情况:
①以某个节点为起始,并且尾端节点在它的子树中
②以某个节点为起始,并且尾端节点不在他的子树中
所以我们只要对着两种路径进行搜索即可。
/**
* 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 result;
int maxPathSum(TreeNode* root) {
result = INT_MIN;//初始化
result = max(myMaxPathSum(root), result);//更新最大值
return result;
}
//返回以root为起始节点的最大路径(尾端节点在子树里面的情况)
int myMaxPathSum(TreeNode* root){
if (root == NULL){
return 0;
}
int leftMax = INT_MIN / 4;
int rightMax = INT_MIN / 4;
if (root->left != NULL){
leftMax = myMaxPathSum(root->left);//寻找左子树的起始节点最大路径
}
if (root->right != NULL){
rightMax = myMaxPathSum(root->right);//寻找右子树的起始节点最大路径
}
int maxValue = max(leftMax, rightMax);//左、右子树为起点路径的最大值
result = max(result, maxValue);//更新result(maxValue代表路径:以左子树为起始路径、右子树为起始路径)(尾端节点在子树里面的情况)
result = max(result, leftMax + root->val + rightMax);//更新result,(leftMax + root->val + rightMax代表,左子树最长+根节点+右子树最长的组合路径)(尾端节点不在子树里面的情况)
//返回以root为起始节点的路径最大值(尾端节点在子树里面的情况)
if (maxValue > 0){
//只有当以左或者右为起始节点的最长路径大于0,才可将root更新为以root为起始路径的最长路径
return maxValue + root->val;
}
else{
//否则以root为起始节点的最长路径就是它自己一个节点
return root->val;
}
}
};