老卫带你学---leetcode刷题(124. 二叉树中的最大路径和)

124. 二叉树中的最大路径和

问题:

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 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
提示:

树中节点数目范围是 [1, 3 * 104]
-1000 <= Node.val <= 1000

解决:

这道题典型的dfs问题,我们只需要dfs拿到子树可以提供的最大价值就好,对于这种规模不同的相同子问题,直接dfs+递归走起。

所以我们的dfs在计算的时候

  • 一方面要统计该子树所拥有的的最大路径和,用来和最终结果做比较
  • 一方面要计算该子树可以提供给父亲的最大价值,从而递归
func maxPathSum(root *TreeNode) int {
	maxNum := math.MinInt32 //这里不要用Int,因为Int为0,如果给个用例是负数就过不了了,得给它来个大负数
	var dfs func(root *TreeNode) int
	dfs = func(root *TreeNode) int {
		if root == nil {
			return 0
		}
		left := dfs(root.Left)
		right := dfs(root.Right)
		innerMaxNum := left + root.Val + right //当前子树最大路径和,所以下面需要和外面的maxNum做对比
		maxNum = max(innerMaxNum, maxNum)
		outMaxNum := root.Val + max(left, right) //当前子树可以提供给父亲节点最大价值,用于递归延续
		return max(outMaxNum, 0)
	}

	dfs(root)
	return maxNum
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

你可能感兴趣的:(leetcode)