题目:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
刚看到题目就先入为主的以为最大路径和不是在左边就是在右边,然后用递归实现求单边分支最大值,方法 如下:
// 该方法求解的是当前节点加上左分支 【或】 右分支的最大路径和。
public int oneSideMax(TreeNode root) {
if (root == null) {
return 0;
}
// 左分支上的最大路径和,注意这里要和0比较,如果小于0的则可以舍弃。
int left = Math.max(oneSideMax(root.left), 0);
// 右分支上的最大路径和
int right = Math.max(oneSideMax(root.right), 0);
return Math.max(left, right) + root.val;
}
但是跑了用例后,发现错误了。主要原因是最大路径和还有可能出现在左分支加右分支加当前节点上。
故加入对这种情况的处理,这种情况可以在上面的递归中处理。 具体代码如下:
int ans = Integer.MIN_VALUE; // 用于记录最大路径和
public int oneSideMax(TreeNode root) {
if (root == null) {
return 0;
}
// 左分支上的最大路径和,注意这里要和0比较
int left = Math.max(oneSideMax(root.left), 0);
// 右分支上的最大路径和
int right = Math.max(oneSideMax(root.right), 0);
// 最关键的两步
// 在递归过程中,不断比较左右分支加上当前节点的路径和
int newPath = left + right + root.val;
// 同已知的最大路径比较
ans = Math.max(ans, newPath);
// 注意方法的定义是求单边的和。
return Math.max(left, right) + root.val;
}
这种方法的思想是在不断递归的过程中调整目标值,递归的方法可能不是直接计算结果的,但是结果可以在这个递归的过程中计算。
在上述oneSideMax方法运行结束后,ans即是最大的路径和。
1万+

被折叠的 条评论
为什么被折叠?



