2020年4月29日 星期三

Leetcode題解 Python & C#:四月挑戰DAY29 Binary Tree Maximum Path Sum

給一串非空的二元樹,找出最大的路徑總和。

如果要使用遞迴的想法:以尋找當前的節與左右兩邊子樹最大的路徑,可以找到通過該節的最大路徑。

如果要住上傳,那會是左右或零取大者加自身再上傳。

因此遞迴函數要有兩種:
1.回傳值是到該點的最大路徑。
2.由1.得到左右最大的路徑,去計算通過該點的最大路徑。

Python
class Solution:
    def maxPathSum(self, root: TreeNode) -> int:
        self.result = root.val
        def dfs(node):
            if not node: return 0
            rsum = dfs(node.right)
            lsum = dfs(node.left)
            maxPath = node.val+max(0, rsum, lsum)
            self.result = max(maxPath, node.val+lsum+rsum, self.result)
            return maxPath              
        dfs(root)
        return self.result
C#
public class Solution {    
    public int result;
    
    public int MaxPathSum(TreeNode root) {
        result = root.val;
        dfs(root);
        return result;
    }
    
    public int dfs(TreeNode node)
    {
        if(node is null){return 0;}    
        var values = new int[2];
        int rsum = dfs(node.right);
        int lsum = dfs(node.left);
        values[0] = Math.Max(node.val + rsum, node.val + lsum);
        values[0] = Math.Max(node.val, values[0]);
        values[1] = node.val + lsum + rsum;
        result = Math.Max(Math.Max(values[0],values[1]),result);
        return values[0];
    }
}