[Leetcode]29.二叉树中的最大路径和

题目:路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。

示例 1:
[Leetcode]29.二叉树中的最大路径和
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例 2:
[Leetcode]29.二叉树中的最大路径和
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

 

思想:

后序遍历,我们把问题分成两种情况

情况一:路径包括当前结点(父节点)

我们需要将左右子树的路径信息传回,返回的值是子树中最大的那一边加上父节点的和,注意如果出现负值则舍弃不加入。

返回一边的原因是,路径不能走回头路。

情况二:路径不包括当前结点(父节点)

我们只需要返回左右子树的最大路径即可。

func maxPathSum(root *TreeNode) int {
	var max 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)
		curmax := root.Val+left+right  //情况二,我们先计算子树的路径大小,curmax
		if curmax>max{
			max = curmax  //如果比目前最大的还要大,则取而代之
		}
		var outmax int  //情况一,如果考虑父结点,我们计算出能给父结点提供最大路径的那一边outmax,不同时使用两边是为了不重复路径
		if left>right{
			outmax = root.Val+left
		}else{
			outmax = root.Val+right
		}
		if outmax>0 {
			return outmax  //如果是正值,则返回给父结点,等父结点调用更新max
		}
		return 0  //如果左右子树都提供负值,都舍弃返回父结点一个0值
	}
	dfs(root)
	return max
}

题目来源:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum

 
上一篇:新生29场


下一篇:2021115 LeetCode刷题 反转字符串中的单词 III (难度:简单)