问题分析:
对每一个节点root来说,都维护左右最大子树的值,和其最大路径和max(rootVal,rootVal+leftVal,rootval+rightVal,rootval+rightVal+leftVal),也就是需要获取最大左右子树,即root1的返回值max(root1Val,root1Val+leftVal,root1val+rightVal);
给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)
样例
给出一棵二叉树:
1 / \ 2 3
返回 6
/**
* 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 max=-10000000;
int findMax(int a1,int a2,int a3,int a4){
a1=a1>a2?a1:a2;
a3=a3>a4?a3:a4;
a1=a1>a3?a1:a3;
return a1;
}
int maxPathSum1(TreeNode * root) {
// write your code here
int rootVal,leftVal,rightVal;
if(root->val!=NULL)
rootVal=root->val;
else
rootVal=0;
if(root->left!=NULL)
leftVal=maxPathSum1(root->left);
else
leftVal=0;
if(root->right!=NULL)
rightVal=maxPathSum1(root->right);
else
rightVal=0;
int temp=findMax(leftVal+rootVal,rightVal+rootVal,rootVal,rootVal+leftVal+rightVal);
max=max<temp?temp:max;
return findMax(leftVal+rootVal,rightVal+rootVal,rootVal,-10000000);
}
int maxPathSum(TreeNode * root) {
// write your code here
maxPathSum1(root);
return max;
}
};