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

本文解析了一道关于二叉树的最大路径和问题,通过递归与动态规划结合的方法,详细阐述了解决方案的思考过程与实现细节,包括如何避免路径重复计算的问题。

乍一看这是一道困难题,但可能因为最近做的关于树的题目比较多,所以其实并没有真正意义上觉得特别困难,很多别的类型的中等题感觉比这还要难。

题意:一棵非空二叉树,节点可正可负可为零,求最大路径和

  1. 最开始的想法还是递归,其实也有一点动态规划的思想
    从根节点开始,依次计算子树包含子树根节点的最大路径和,保证了能够连成一条通路
    包含该子树根节点的最大路径和:左子树最大路径和(if>0)+根节点+右子树最大路径和(if>0)
    判断该子树最大路径和是否大于目前的最大值,是则替换
    提交后有一些错了
  2. 然后发现有一个小问题,如果一个子树同时加了左子树和右子树的最大路径,就不能继续往上一级根节点加了,因此return的值不能是“左子树最大路径和(if>0)+根节点+右子树最大路径和(if>0)”,而应该改成“根节点+ max(左子树最大路径和, 右子树最大路径和)(if>0)”,这样就可以了~
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
	def __init__(self):
		self.ans = -1000000000
	def maxPathSum(self, root: TreeNode) -> int:
		
		def findMax(tree: TreeNode):
			res = tree.val
			x = 0
			y = 0
			if tree.left:
				x = findMax(tree.left)
				if x > 0: 
					res += x
			if tree.right:
				y = findMax(tree.right)
				if y > 0: 
					res += y
			if res > self.ans:
				self.ans = res
			
			x = x if x > y else y
			
			return tree.val + x if x > 0 else tree.val
		
		total = findMax(root)
		return self.ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值