我的算法9

題目地址https://leetcode.com/problems/binary-tree-maximum-path-sum/#/description

題目描述:Given a binary tree, find the maximum path sum.
For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain at least one node and does not need to go through the root.

我的代碼

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int dfs(TreeNode* root,int& sum){
        if(!root) return 0;
        int left=dfs(root->left,sum);
        int right=dfs(root->right,sum);
        int m=root->val;
        if(left>0) m+=left;
        if(right>0) m+=right;
        if(m>sum) sum=m;
        if(max(left,right)<0) return root->val;
        else return max(left,right)+root->val;
    }
    int maxPathSum(TreeNode* root) {
        if(!root) return 0;
        int sum = root->val;
        dfs(root,sum);
        return sum;
    }
};

解題思路
採用遞歸的思想。用sum來記錄所有中間過程中的最大路徑和,一旦出現更大的值才替換它。由於至少有一個點,所以用根節點的值來初始化sum。
可以想到,最長路徑一定包括一個子樹的根節點,因爲我們在遞歸的過程中會將每一個點都當做根節點。所以對於遞歸的我們只需考慮包含根節點的情況。這樣的情況分爲兩種,
第一種是假設最長路徑並不是在這個子樹中,但這個子樹包含最長 路徑的一部分,如此,就獲得一條以該根節點爲端點的最長路徑,並作爲返回值。
第二種情況是假設最長路徑就在這個子樹中。於是可以對左子樹的返回值,右子樹的返回值,根節點的值做判斷,看其最大的情況下是否大於當前的sum,如果大於,更新sum即可。
該算法對整個樹遍歷了一遍,複雜度爲O(n)。

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