描述:
給出一棵二叉樹,尋找一條路徑使其路徑和最大,路徑可以在任一節點中開始和結束(路徑和爲兩個節點之間所在路徑上的節點權值之和)
樣例:
給出一棵二叉樹:
1 / \ 2 3
返回 6
首先要考慮到二叉樹中的節點存在正數也存在負數,且最大路徑和所在路徑是任意兩個節點的通路或者是一個節點自己。
所以不能直接使用之前根節點到葉子節點的最大路徑和的求解方法。
1.如果這個節點是空,則返回值爲0;
2.遍歷節點的左子樹和右子樹,將左子樹的最大不分叉路徑(大於0)+右子樹的最大不分叉路徑(大於0)+節點本身的值
與當前最大路徑和Max作比較,將較大的數保存於Max;
3.返回左右節點的中較大不分叉路徑和(大於零)+節點值,作爲遞歸調用。
AC代碼:
/**
* 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 maxpath(TreeNode* root,int &Max)
{
if(root==NULL)
return 0;
int l=maxpath(root->left,Max);
int r=maxpath(root->right,Max);
Max=max(Max,max(0,l)+max(0,r)+root->val);
return max(0,max(l,r))+root->val;
}
int maxPathSum(TreeNode * root) {
// write your code here
if(root==NULL)
return 0;
int Max=INT_MIN;
maxpath(root,Max);
return Max;
}
};