二叉樹中的最大路徑和-LintCode

描述:

給出一棵二叉樹,尋找一條路徑使其路徑和最大,路徑可以在任一節點中開始和結束(路徑和爲兩個節點之間所在路徑上的節點權值之和)

樣例:

給出一棵二叉樹:

       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;
        
    }
};



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章