二叉树中的最大路径和-递归实现(Python版)

题目描述

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例1:
在这里插入图片描述
示例2:
在这里插入图片描述

解题思路

遇到二叉树的题,如果能用递归就尽量递归吧。
首先回顾递归三步骤:
1、递归终止条件及返回值
2、递推条件
3、返回值分析处理
具体到这道题,采用递归的三个步骤具体化为:
1、递归终止条件为节点为空,返回值为0
2、递推条件:分别递归左右子树,计算左右子树的节点和记为l和r
3、返回值及分析:max(0, l, r) + node.val
这个递归函数实现的是对于一个根节点,通过计算分别计算其左右子树节点和,来看其左右子树是否有正增益。

代码实现

实现部分的核心代码就是self.sum的更新了。

self.sum = max(self.sum, max(0, leftSum)+max(0,rightSum)+root.val)

在更新self.sum时有两个判断,一个是self.sum,另一个包含了两个max加上当前节点的值。
注意此处用的是

max(0, leftSum) + max(0, rightSum) + root.val

这样就是说如果左右子树对于根节点无增益的话,就用0来替代左右子树和,但同时也计算了当前节点的值。

对于这个递归函数,注意其计算顺序,先计算左子树的最大和,再计算右子树的最大和,最后返回

max(0, leftSum, rightSum) + root.val

在计算完左子树最大和后,计算右子树最大和时,代码

self.sum = max(self.sum, max(0, leftSum)+max(0,rightSum)+root.val)

此处最外层max函数的左边是左子树最大和,右边是右子树最大和,self.sun更新后即为左右子树中和较大的那一个。
最后一次更新self.sum时,最外层max函数左边为左右子树最大和中较大的那一个,右边为左子树增益(若左子树和小于0则无增益,用0替代)加上右子树增益加上根节点的和。

class Solution:
    def maxPathSum(self, root: TreeNode) -> int:
        self.sum = float('-inf')
        def dfs(root):
            if not root:
                return 0
            leftSum = dfs(root.left)
            rightSum = dfs(root.right)
            self.sum = max(self.sum, max(0, leftSum)+max(0,rightSum)+root.val)
            return max(0, leftSum, rightSum) + root.val
        dfs(root)
        return self.sum
在计算二叉树最大深度时,前序遍历可以通过递归方式实现递归方法是一种直观且常见的实现方式,其核心思想是通过递归调用分别计算左子树右子树的深度,并取较大值加上当前节点的深度(通常为1),从而得到整棵树的最大深度。 ### 递归实现原理 递归实现中,前序遍历的顺序是:访问根节点 -> 递归遍历左子树 -> 递归遍历右子树。虽然前序遍历本身主要用于访问节点的顺序,但可以在访问每个节点时维护当前路径的深度,并在递归过程中不断更新最大深度。 以下是使用递归实现的前序遍历方式计算二叉树最大深度的 Python 代码: ```python class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None def max_depth_preorder_recursive(root): if not root: return 0 # 递归计算左右子树的最大深度 left_depth = max_depth_preorder_recursive(root.left) right_depth = max_depth_preorder_recursive(root.right) # 返回当前节点的最大深度(当前节点深度为1,加上子树的最大深度) return 1 + max(left_depth, right_depth) ``` ### 示例 构建如下二叉树: ``` 1 / \ 2 3 / \ 4 5 ``` 对应的节点定义如下: ```python # 构建示例二叉树 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) # 计算最大深度 print(max_depth_preorder_recursive(root)) # 输出: 3 ``` ### 代码说明 - 递归函数 `max_depth_preorder_recursive` 用于计算以当前节点为根的子树的最大深度。 - 若当前节点为空,则返回深度为 0。 - 分别递归计算左子树右子树的最大深度,并取较大值,加上当前节点的深度(即 1)。 - 时间复杂度为 **O(n)**,其中 `n` 是节点数量,因为每个节点都会被访问一次。 - 空间复杂度为 **O(h)**,其中 `h` 是树的高度,取决于递归栈的最大深度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值