[Day32]-[二叉树] 二叉树中的最大路径和
124. 二叉树中的最大路径和
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root
,返回其 最大路径和 。
示例 1:
复制代码
示例 2:
复制代码
题解:
复制代码
本文字数:638 字
阅读完需:约 2 分钟
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root
,返回其 最大路径和 。
示例 1:
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
示例 2:
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
题解:
func TestMaxPathSum(t *testing.T) {
var root = &TreeNode{
Val: -10,
Left: &TreeNode{
Val: 9,
},
Right: &TreeNode{
Val: 20,
Left: &TreeNode{
Val: 15,
},
Right: &TreeNode{
Val: 7,
},
},
}
var ans = math.MinInt // 初始最小值
var dfs func(root *TreeNode) int // 采用LRD递归
var max func(x, y int) int // 取最大值
max = func(x, y int) int {
if x > y {
return x
}
return y
}
dfs = func(root *TreeNode) int {
if root == nil { // 递归终止条件
return 0
}
l := max(0, dfs(root.Left)) // 左节点最大和
r := max(0, dfs(root.Right)) // 右节点最大和
ans = max(ans, l+r+root.Val) // 如果加上根的值小于上一次的ans,则保持不变
return max(l, r) + root.Val // 左节点 或则 右节点 最大和
}
dfs(root)
t.Log(ans)
}
Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入
我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!
促进软件开发及相关领域知识与创新的传播
评论