题目:
给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)
样例:
给出一棵二叉树:{1,2,3}
返回 6
思路:
指定某个节点为根时,一条经过root的最大路径,这条路径可能是: 1) 左边某条路径 + root + 右边某条路径
(左右子树的路径加上当前节点) 2) 左边某条路径 + root (左子树的路径加上当前节点) 3) root + 右边某条路径
(右子树的路径加上当前节点) 4) root
然而这四种情况只是用来计算以当前节点根的最大路径,如果当前节点上面还有节点,那它的父节点是不能累加第1种情况的。
所以要保存两个最大值,一个是当前节点下最大路径和maxCurrent(没有父节点),另一个是如果要连接父节点时最大的路径和maxSum。
参考答案:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param root: The root of binary tree.
* @return: An integer
*/
int res = -1000000;
int maxPathSum(TreeNode * root) {
// write your code here
helper(root);
return res;
}
int helper(TreeNode * root)
{
if(root == NULL) return 0;
int left = helper(root->left);
int right = helper(root->right);
int maxSum = max(max(left+root->val, right+root->val), root->val);
int maxCurrent = max(maxSum, root->val+left+right);
//cout<<maxSum<<endl;
res = max(res,maxCurrent);
return maxSum;//注意返回的是maxSum
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。