1、题目描述:
2、题解:
深度优先搜索
思路:
二叉树abc,a是根节点,bc是左右子树
a
/ \
b c
有三种情况:
1)a + b + c
2)b + a + a的父节点
3)c+ a + a的父节点
第一种情况是没法递归的,因为同时选了,就不能连通a的父节点,但却可能是最大的路径
情况2和3可以整合一下,不可能都取,只能是取两种情况的最大值。
代码框架:
public int dfs(TreeNode root) {
if (root == null) {
return Integer.MIN_VALUE;
}
//左子树的最大值
int left = maxPathSum(root.left);
//右子树的最大值
int right = maxPathSum(root.right);
//再考虑包含根节点的最大值
int all = ....;
return Math.max(Math.max(left, right), all);
}
比如:
8
/ \
-3 7
/ \
1 4
\ / \
3 2 6
考虑左子树 -3 的路径的时候,我们有左子树 1 和右子树 4 的选择,但我们不能同时选择
如果同时选了,路径就是 ... -> 1 -> -3 -> 4 -> ... 就无法通过根节点 8 了
所以我们只能去求左子树能返回的最大值,右子树能返回的最大值,选一个较大的
我们设置一个全局变量,来保存我们想求的结果,代码如下:
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
#深度优先搜索
def dfs(root):
if not root:
return 0
left = max(dfs(root.left),0)
right = max(dfs(root.right),0)
# 求的过程中考虑包含当前根节点的最大路径
self.val = max(self.val,root.val + left + right)
# 只返回包含当前根节点和左子树或者右子树的路径
return root.val + max(left,right)
if not root:
return 0
self.val = float('-inf')
return dfs(root)
前边遇到过和全局变量结合的递归,例如 106 题,当递归和全局变量结合有时候确实会难理解些。而在 110 题 中也应用了和这个题一样的思想