leetcode刷题11

这是周六应该做的题,是LeetCode第124题。题目的要求是:给定一个二叉树,求出其二叉树上最大路径和,可以不经过根节点

这个题到最后也没啥思路,于是借用了LeetCode官方解答的思路。

具体地,是用递归,初始化 max_sum 为最小可能的整数并调用函数 max_gain(node = root)。

实现 max_gain(node) 检查是继续旧路径还是开始新路径:

边界情况:如果节点为空,那么最大权值是 0 。
对该节点的所有孩子递归调用 max_gain,计算从左右子树的最大权值:left_gain = max(max_gain(node.left), 0) 和 right_gain = max(max_gain(node.right), 0)。
检查是维护旧路径还是创建新路径。创建新路径的权值是:price_newpath = node.val + left_gain + right_gain,当新路径更好的时候更新 max_sum。
对于递归返回的到当前节点的一条最大路径,计算结果为:node.val + max(left_gain, right_gain)

代码如下:

import LeetcodePart6.TreeNode;
import sun.reflect.generics.tree.Tree;

public class MaxPathSum_124 {
    int max_sum = Integer.MIN_VALUE;
    public int max_gain(TreeNode node){
        if (node == null) return 0;
        int left_gain = Math.max(max_gain(node.left), 0);
        int right_gain = Math.max(max_gain(node.right), 0);
        int price_newpath = node.val + left_gain + right_gain;
        max_sum = Math.max(max_sum, price_newpath);
        return node.val + Math.max(left_gain, right_gain);
    }
    public int maxPathSum(TreeNode root) {
        max_gain(root);
        return max_sum;
    }
}

 

posted @ 2019-08-19 15:58  刘云生  阅读(147)  评论(0编辑  收藏  举报