题意描述:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例:
示例一:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例二:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
解题思路:
Alice: 这道题有点难啊,二叉树中的最大路径和,怎么搜索所有的路径呢 ?
Bob: 怎么搜索所有的路径 ?关键是怎么找到最大路径对应的那个 “根节点”,比如说示例一里面的最大路径的根节点就是 1 ,是最开始的根节点。 示例二 里面的最大路径的根节点是20。
Alice: emmm, 应该是这样,最终的最大路径里面有一个连接 左子树 和 右子树的 根节点,然后其他节点就只能有 一个 左子树或者右子树,而不能有两个。
Bob: 对,好像是一笔画一样,不过该怎么做呢 ?
Alice: 二叉树的题目好多都是递归的方法做的,这道题目可以用递归吗 ?
Bob: 递归的话,我们至少得知道该怎么处理 根节点呀。
Alice: 假设我们已经知道了 经过 左孩子 和 右孩子的 最大路径和,怎么求 经过 root 节点的最大路径和呢 ?
Bob: 这个好做啊, 让经过左孩子的最大路径和是 left
, 经过右孩子的最大路径和是 right
, 经过 root
节点的最大路径和应该是 max[left, right, root.val, root.val + left,root.val + right, root.val + left + right ]
Alice: 也就是说这六种情况之一就是 经过 root 节点的最大值。
Bob: 对, 不过还有个问题, 经过 root 节点的最大路径和 并不一定是整个二叉树的最大路径和呀。这怎么办 ?
Alice: 好办, 我们用另一个变量记录 所有 根节点的 最大路径和 的最大值呗,这样就是整个二叉树里面的最大路径和了。
Bob:
Alice:
代码:
Python 方法一:递归。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
self.maxValue = 2**32 * -1
# 最终答案
self.maxNodeValue = 2**32 * -1
# 记录二叉树中所有节点的最大值,针对所有节点全部为负值的测试样例。
self.maxPathSumHelper(root)
if self.maxNodeValue < 0 and self.maxValue >= 0:
# 所有节点都是负数
return self.maxNodeValue
else:
return self.maxValue
def maxPathSumHelper(self, root: TreeNode) -> int:
# return root's path maxNumber
if root == None:
return 0
else:
left = max(self.maxPathSumHelper(root.left), 0)
right = max(self.maxPathSumHelper(root.right), 0)
# left, right 等于零的时候 表示 抛弃经过left right 的节点的路径
tmp = max([root.val, left, right, root.val + left, root.val + right, root.val + left + right])
# 从所有组合中找到最大值的组合
if tmp > self.maxValue:
self.maxValue = tmp
# 更新路径之和最大值
if root.val > self.maxNodeValue:
self.maxNodeValue = root.val
# 更新节点最大值
return max(left, right) + root.val
Java 方法一: 递归
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int maxValue = -2147483648;
int maxNodeValue = -2147483648;
public int maxPathSum(TreeNode root) {
this.maxPathSumHelper(root);
if(this.maxNodeValue < 0 && this.maxValue >= 0){
return this.maxNodeValue;
}else{
return this.maxValue;
}
}
public int maxPathSumHelper(TreeNode root){
if(root == null){
return 0;
}else{
int left = max(maxPathSumHelper(root.left), 0);
int right = max(maxPathSumHelper(root.right), 0);
int tmp = max(max(max(max(max(left, right), root.val), root.val + left), root.val + right), root.val + left + right);
if(root.val > this.maxNodeValue){
this.maxNodeValue = root.val;
}
if(tmp > this.maxValue){
this.maxValue = tmp;
}
return max(left, right) + root.val;
}
}
public int max(int a, int b){
if(a > b){
return a;
}else{
return b;
}
}
}
易错点:
[1,2,null]
[-1]
[1,2,3]
[-10,-11,-12,null,null,15,7]
3
-1
6
15
总结:
Nothing Replace Hard Work.
官方题解