python-leetcode-二叉树中的最长交错路径

1372. 二叉树中的最长交错路径 - 力扣(LeetCode)

可以使用深度优先搜索(DFS)来遍历二叉树,并计算每个节点开始的最长交错路径。我们需要在递归过程中跟踪当前方向(左或右),以及已访问的节点数。以下是实现方案:

解题思路

  1. 定义DFS函数

    • 以当前节点为起点,递归计算其左子树和右子树的最长交错路径。
    • 递归时记录当前方向(左或右)。
    • 每次递归时,如果前进方向为左,则下次前进方向改为右;反之亦然。
    • 记录全局最大交错路径。
  2. 初始调用

    • 由于交错路径可以从任意节点开始,我们从 root 开始分别向左、向右递归,取最大值。

代码实现

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def longestZigZag(self, root: TreeNode) -> int:
        self.max_length = 0  # 记录最长交错路径

        def dfs(node, is_left, length):
            if not node:
                return
            self.max_length = max(self.max_length, length)
            if is_left:
                dfs(node.left, False, length + 1)  # 改变方向,向左走
                dfs(node.right, True, 1)  # 重新开始,向右走
            else:
                dfs(node.right, True, length + 1)  # 改变方向,向右走
                dfs(node.left, False, 1)  # 重新开始,向左走

        # 从根节点分别尝试向左和向右
        dfs(root.left, False, 1)  # 从根节点的左子树开始,方向为左
        dfs(root.right, True, 1)  # 从根节点的右子树开始,方向为右

        return self.max_length

复杂度分析

  • 时间复杂度:O(N),其中 N 是树中的节点数,每个节点被访问一次。
  • 空间复杂度:O(H),其中 H 是树的高度,递归的最大深度不会超过 H。

示例

输入
root = TreeNode(1)
root.right = TreeNode(1)
root.right.left = TreeNode(1)
root.right.right = TreeNode(1)
root.right.left.right = TreeNode(1)
root.right.left.right.left = TreeNode(1)
root.right.left.right.right = TreeNode(1)

sol = Solution()
print(sol.longestZigZag(root))
输出
3

该代码能高效计算二叉树中的最长交错路径。🚀

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值