这是周六应该做的题,是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; } }