question:
给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少。 这个路径的开始节点和结束节点可以是二叉树中的任意节点
例如:
示例1 输入 {-2,1} 输出 1 示例2 输入 {-2,#,-3} 输出 -2
在这个问题中,我纠结的问题是如何保存目前以及找到的最大值,最后发现使用全局变量就可以了。
算法的思路如下:
1. 对于每一个节点,我们首先找到在以该节点的左孩子节点为根节点的部分中包含该节点左孩子的路径之和的最大值,记为left。同样,我们也要找到在以该节点的右孩子节点为根节点的部分中包含该节点右孩子的路径之和的最大值,记为right。也就是说, 我们要分别在左子树和右子树中分别找到包含该节点左右孩子的路径的最大值。
2.之后我们更新目前已经找到的最大路径节点值之和:首先我们将变量sum初始化为当前节点值,
如果,那么更新
如果,那么更新
3.如果sum大于目前找到的最大值,那么我们使用sum更新目前找到的最大值
4.下面我们返回以当前节点为根节点的子树中,能找到的最大路径的节点值之和:
return max((left>right?(left+node->val):(right+node->val)),node->val)
代码如下:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型
*/
int Max=INT_MIN;
int pre(TreeNode* node){
if(!node)
return 0;
int left=0,right=0;
left=pre(node->left);
right=pre(node->right);
int res=left>right?left:right;
int last;
int sum=node->val;
if(left>0){
sum+=left;
}
if(right>0){
sum+=right;
}
if(res>0){
last=res+node->val;
}else{
last=node->val;
}
if(sum>Max){
Max=sum;
}
return last;
}
int maxPathSum(TreeNode* root) {
// write code here
pre(root);
return Max;
}
};