1. 程式人生 > >LintCode-分治-二叉樹中的最大路徑和

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

解題思路:該題目是求二叉樹的最大路徑和,即二叉樹中連結在同一條路徑上的節點值相加的最大值。那麼這個路徑有可能只在左子樹中,有可能從左子樹經過節點到右子樹,也有可能在右子樹中。所以需要判斷。

解題過程:首先新建一個函式,求除節點外,左右子樹節點那條路徑和最大(該路徑是從節點開始只包含在左子樹或者右子樹中的路徑)。先求經過根節點的最大路徑和,首先定義一個整形max=0和count=0,若左子樹不空,那麼count賦值為左子樹的最大路徑和,然後count>0時,max+=count。右子樹類似。然後得到了經過根節點的最大路徑和max。然後利用遞迴求左子樹的最大路徑和m1,和右子樹的最大路徑和m2,然後比較max,m1,m2的最大值。返回。

程式碼實現:

int BiggerChild(TreeNode * root)
{
    if(root==NULL) return 0;
    else{
        int max=-1000000000,m1=0,m2=0;
        if(root->left!=NULL) m1=root->left->val;
        if(root->right!=NULL) m2=root->right->val;
        m1+=BiggerChild(root->left);
        max=m1;
        m2+=BiggerChild(root->right);
        if(max<m2) max=m2;
        return max;
    }
}
int maxPathSum(TreeNode * root)
{
    if(root==NULL) return 0;
    else{
            int max=root->val,m1=-10000000,m2=-100000000,count;
            if(root->left!=NULL)
            {
                count=root->left->val+BiggerChild(root->left);
                if(count>0) max+=count;
                m1=maxPathSum(root->left);
            }
            if(root->right!=NULL)
            {
                count=root->right->val+BiggerChild(root->right);
                if(count>0) max+=count;
                m2=maxPathSum(root->right);
            }
            if(max<m1) max=m1;
            if(max<m2) max=m2;
             return max;
      }
}

個人總結:我自己又令定義了一個新的函式,也會有別的辦法,也有更簡單的辦法。

注意事項:需要注意的就是要理清思路,其餘也沒有多大的問題。