LeetCode算法题(Go语言实现)_37

news2025/4/18 21:18:46

题目

给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下:
选择二叉树中 任意 节点和一个方向(左或者右)。
如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。
改变前进方向:左变右或者右变左。
重复第二步和第三步,直到你在树中无法继续移动。
交错路径的长度定义为:访问过的节点数目 - 1(单个节点的路径长度为 0 )。
请你返回给定树中最长 交错路径 的长度。

一、代码实现

func longestZigZag(root *TreeNode) int {
    maxLen := 0
    var dfs func(*TreeNode) (int, int)
    dfs = func(node *TreeNode) (int, int) {
        if node == nil {
            return 0, 0
        }
        _, leftRight := dfs(node.Left)
        rightLeft, _ := dfs(node.Right)
        currentLeft, currentRight := 0, 0
        if node.Left != nil {
            currentLeft = leftRight + 1
        }
        if node.Right != nil {
            currentRight = rightLeft + 1
        }
        if currentLeft > maxLen {
            maxLen = currentLeft
        }
        if currentRight > maxLen {
            maxLen = currentRight
        }
        return currentLeft, currentRight
    }
    dfs(root)
    return maxLen
}

二、算法分析

1. 核心思路
  • 动态规划(后序遍历):每个节点维护两个状态,表示从该节点出发下一步向左或向右的最长交错路径长度。
  • 状态转移:当前节点的左方向长度由左子节点的右方向长度加1,右方向长度由右子节点的左方向长度加1。
  • 全局最大值:在遍历过程中不断更新最长路径长度。
2. 关键步骤
  1. 递归终止:空节点返回 (0, 0)
  2. 状态计算:根据左右子节点返回的状态计算当前节点的左右方向长度。
  3. 更新最大值:比较并更新全局最长路径长度。
  4. 返回状态:返回当前节点的左右方向长度供父节点使用。
3. 复杂度
指标说明
时间复杂度O(n)每个节点遍历一次
空间复杂度O(h)递归栈空间,h为树的高度

三、图解示例

在这里插入图片描述

四、边界条件与扩展

1. 特殊场景验证
  • 单节点树:直接返回0。
  • 完全左斜树:所有节点只有左子节点,最长路径为1。
  • 交替路径:如 1→2→3→4→5,路径长度为4。
2. 多语言实现
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_len = 0
        
        def dfs(node):
            if not node:
                return (0, 0)
            left_left, left_right = dfs(node.left)
            right_left, right_right = dfs(node.right)
            current_left = left_right + 1 if node.left else 0
            current_right = right_left + 1 if node.right else 0
            self.max_len = max(self.max_len, current_left, current_right)
            return (current_left, current_right)
        
        dfs(root)
        return self.max_len
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

class Solution {
    private int maxLen = 0;
    
    public int longestZigZag(TreeNode root) {
        dfs(root);
        return maxLen;
    }
    
    private int[] dfs(TreeNode node) {
        if (node == null) return new int[]{0, 0};
        int[] left = dfs(node.left);
        int[] right = dfs(node.right);
        int currentLeft = node.left != null ? left[1] + 1 : 0;
        int currentRight = node.right != null ? right[0] + 1 : 0;
        maxLen = Math.max(maxLen, Math.max(currentLeft, currentRight));
        return new int[]{currentLeft, currentRight};
    }
}

五、总结与扩展

1. 核心创新点
  • 状态定义:通过左右方向状态分离,避免路径方向冲突。
  • 后序遍历:自底向上递推,确保子问题先解。
2. 扩展应用
  • 多方向路径:扩展到多叉树,增加状态维度。
  • 加权路径:节点带权重,求最大权重路径。
  • 实时更新:处理动态树结构,增量维护状态。
3. 工程优化
  • 迭代实现:用栈模拟递归,减少函数调用开销。
  • 并行处理:对子树进行并行计算,提升大规模数据处理效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2332485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 react-three-fiber 快速重构 Three.js 场景⚛️

不明白的知识先放在一边,激发兴趣是第一步,所以不必纠结代码的细节,相信我你很快就会爱上这种感觉!!! 今天,我们将更进一步,将上一篇中vite npm传统 Three.js 原生代码完整 重构为 …

RT-Thread 屏蔽在线软件包的方法

说明 可能大家对 RT-Thread 的 Kconfig 配置项,Scons 构建有些疑惑,其实 BSP 的 Kconfig 可以自由的配置,目录也可以自由的调整 RT-Thread BSP 默认都有在线软件包的配置项,如果你不需要在线软件包,也可以把这个配置项…

深入理解Java反射

反射(Reflection)是Java语言的一个强大特性,它允许程序在运行时动态地获取类的信息并操作类或对象的属性、方法和构造器。就是在获取运行时的java字节码文件,通过各种方法去创建对象,反射是Java被视为动态语言的关键特性之一。 反射其实就是…

Apipost自定义函数深度实战:灵活处理参数值秘籍

在开发过程中,为了更好地处理传递给接口的参数值,解决在调试过程中的数据处理问题,我们经常需要用到函数处理数据。 过去,我们通过预执行脚本来处理数据,先添加脚本,然后将处理后的结果再赋值给请求参数。…

对重大保险风险测试的算法理解

今天与同事聊到重大保险风险测试,借助下面链接的文章, 谈IFRS 17下的重大保险风险测试 - 知乎 谈一下对下图这个公式的理解。 尤其是当看到下面这段文字的解释时,感觉有些算法上的东西,需要再澄清一些。 首先,上面文…

如何白嫖Grok3 API? 如何使用Grok3 API调用实例?怎么使用Grok3模型?

前段时间,Grok3(想要体验Grok3的童鞋可以参考本文:Grok 上线角色扮演功能,教你课后作业手到擒来,Grok3使用次数限制?如何使用Grok3? Grok3国内支付手段如何订阅升级Premium - AI is all your need!&#x…

Fast网络速度测试工具

目录 网站简介 功能特点 测试过程 为什么使用Fast 如果网络速度不达标 网站简介 Fast是一个由Netflix提供的网络速度测试工具,主要用来测试用户的互联网下载速度。它以其简洁的界面和快速的测试过程而受到用户的欢迎。 功能特点 下载速度测试:这是…

ubuntu20.04在mid360部署direct_lidar_odometry(DLO)

editor:1034Robotics-yy time:2025.4.10 1.下载DLO,mid360需要的一些...: 1.1 在工作空间/src下 下载DLO: git clone https://github.com/vectr-ucla/direct_lidar_odometry 1.2 在工作空间/src下 下载livox_ros_driver2&…

制造企业数据治理体系搭建与业务赋能实践

当下制造企业正面临着前所未有的机遇与挑战,从多环节业务协同的复杂性,到海量数据资源的沉睡与孤岛化;从个性化定制需求的爆发,到供应链效率优化的迫切性——如何通过数据治理将“数据包袱”转化为“数据资产”,已成为…

【LunarVim】解决which-key 自定义键位注册不成功问题

问题描述 LunarVim将which-key设置放在一个keymaps.lua中,然后config.lua调用reload “user.keymaps”,键位没用注册成功,而直接写在config.lua中,就注册成功 这暴露了LunarVim 插件和配置加载顺序的一些细节坑,下面解…

开源推荐#5:CloudFlare-ImgBed — 基于 CloudFlare Pages 的开源免费文件托管解决方案

大家好,我是 jonssonyan。 寻找一个稳定、快速、还最好是免费或成本极低的图床服务,一直是许多开发者、博主和内容创作者的痛点。公共图床可能说关就关,付费服务又增加成本。现在,一个名为 CloudFlare-ImgBed 的开源项目&#xf…

算法训练之动态规划(三)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

xv6-labs-2024 lab2

lab-2 0. 前置 课程记录 操作系统的隔离性,举例说明就是,当我们的shell,或者qq挂掉了,我们不希望因为他,去影响其他的进程,所以在不同的应用程序之间,需要有隔离性,并且&#xff0…

基于FPGA实现BPSK 调制

目录 一、 任务介绍二、基本原理三、基于FPGA实现BPSK 调制四、源码 一、 任务介绍 BPSK 调制在数字通信系统中是一种极重要的调制方式,它的抗干扰噪声性能及通频带的利用率均优先于 ASK 移幅键控和 FSK 移频键控。因此,PSK 技术在中、高速数据传输中得…

在排序数组中查找元素的第一个和最后一个位置 --- 二分查找

目录 一:题目 二:算法原理分析 三:代码实现 一:题目 题目链接: 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) 二:算法原理分析 三:代码实现 c…

631SJBH中小型企业的网络管理模式的方案设计

1.1、研究现状 我国很多企业信息化水平一直还处在非常初级的阶段,有关统计表明,真正实现了计算机较高应用的企业在全国1000多万中小企业中所占的比例还不足10%幢3。大多数企业还停留在利用互联网进行网上查询(72.9%)、…

LangChain4j(1):初步认识Java 集成 LLM 的技术架构

LangChain 作为构建具备 LLM 能力应用的框架,虽在 Python 领域大放异彩,但 Java 开发者却只能望洋兴叹。LangChain4j 正是为解决这一困境而诞生,它旨在借助 LLM 的强大效能,增强 Java 应用,简化 LLM 功能在Java应用中的…

【C++算法】53.链表_重排链表

文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 143. 重排链表 题目描述: 解法 模拟 找到链表的中间节点 快慢双指针 把后面的部分逆序 双指针,三指针,头插法 合并两个链表 合并两个有…

多卡分布式训练:torchrun --nproc_per_node=5

多卡分布式训练:torchrun --nproc_per_node=5 1. torchrun 实现规则 torchrun 是 PyTorch 提供的用于启动分布式训练作业的实用工具,它基于 torch.distributed 包,核心目标是简化多进程分布式训练的启动和管理。以下是其主要实现规则: 进程启动 多进程创建:torchrun 会…

Elasticsearch:加快 HNSW 图的合并速度

作者:来自 Elastic Thomas Veasey 及 Mayya Sharipova 过去,我们曾讨论过搜索多个 HNSW 图时所面临的一些挑战,以及我们是如何缓解这些问题的。当时,我们也提到了一些计划中的改进措施。本文正是这项工作的成果汇总。 你可能会问…