class Solution {
public:
int maxPathSum(TreeNode* root) {
if(root==NULL) return 0;
int sum = 0;
int single = 0;
path(root,sum,single);
return sum;
}
void path(TreeNode * root,int & sum , int & single){
if(root->left==NULL && root->right==NULL)
{
sum=root->val;
single = root->val;
return;
}
int left_sum = 0;
int left_single = 0;
int right_sum = 0;
int right_single = 0;
if(root->left) path(root->left,left_sum,left_single);
if(root->right) path(root->right,right_sum,right_single);
sum = root->val;
single = root->val;
if(root->left){
single=max(left_single+root->val,single);
sum = max(max(sum,single),left_sum);
}
if(root->right){
single=max(right_single+root->val,single);
sum = max(max(sum,single),right_sum);
if(root->left)
sum = max(sum,left_single+root->val+right_single);
}
return;
}
};
二叉树的最大路径和,写了一个通过的,拿到一个根节点,需要比较,根,根+左孩子,根+右孩子,根+左孩子+右孩子,选出一个全局最大的,是作为当前根的最大路径和;这里有一个点,路径,要分析好,就是不能右分叉,比如去了左+根+右,那么递归返回时,上一层的根就不能和这个路径值相加了,因为那样就不是路径了,因此需要维护两个参数,sum和single,sum是当前可见的最大路径和,single是不同时包含左右子树的最大路径和,也就是{根,根+左,根+右}三种;同样在利用左右子树的返回值进行计算时,也要考虑到,与根相加不能使用孩子返回的sum,而只能使用孩子返回的single。但是在求sum时,需要考虑到只有左孩子和只有右孩子,这个相当于一个全局最大值。
需要处理太多参数了,对吗?优化版本,可以把max设成一个全局变量,single作为函数返回值。
class Solution {
public:
int res=INT_MIN;
int maxPathSum(TreeNode* root) {
if(root==NULL) return 0;
path(root);
return res;
}
int path(TreeNode * root){
if(root==NULL) return 0;
int con1 = root->val;
int left=path(root->left);
int right=path(root->right);
int con2 = root->val+left;
int con3 = root->val+right;
int con4 = root->val+left+right;
res = max(res,max(max(con1,con2),max(con3,con4)));
return max(con1,max(con2,con3));
}
};