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

输入:root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
输出:3
解释:蓝色节点为树中最长交错路径(右 -> 左 -> 右)。
示例 2:

输入:root = [1,1,1,null,1,null,null,1,1,null,1]
输出:4
解释:蓝色节点为树中最长交错路径(左 -> 右 -> 左 -> 右)。
示例 3:
输入:root = [1]
输出:0
提示:
每棵树最多有 50000 个节点。
每个节点的值在 [1, 100] 之间。
实现思路
实现最长交错路径(Longest ZigZag Path)的问题涉及在二叉树中找到一条路径,该路径上的每一步都在左右子树之间交替。具体来说,路径从根节点开始,每次选择左子节点或右子节点,但不能连续两次选择同一个方向。最长交错路径的长度是这条路径上边的数量。
代码详解
- 定义数据结构
首先,定义一个二叉树节点的类,用于表示树中的每个节点。
class TreeNode:def __init__(self, value=0, left=None, right=None):self.value = valueself.left = leftself.right = right
- 初始化类和变量
在解决方案类中,定义一个变量来记录最长交错路径的长度,并初始化该类。
class Solution:def __init__(self):self.max_length = 0
- 定义递归函数
使用深度优先搜索(DFS)来遍历二叉树。在每个节点,记录当前路径的长度,并更新最长交错路径的长度。定义递归函数 dfs 来处理这个过程。
def dfs(node, direction, length):if not node:returnself.max_length = max(self.max_length, length)if direction == 'left':dfs(node.left, 'left', 1) # 重置左边路径长度dfs(node.right, 'right', length + 1) # 继续增加右边路径长度else:dfs(node.left, 'left', length + 1) # 继续增加左边路径长度dfs(node.right, 'right', 1) # 重置右边路径长度
- 调用递归函数
在主函数 longestZigZag 中,从根节点开始,以左和右两个方向调用递归函数 dfs。
def longestZigZag(self, root: TreeNode) -> int:dfs(root, 'left', 0)dfs(root, 'right', 0)return self.max_length
- 将上述步骤组合成完整的代码:
class TreeNode:def __init__(self, value=0, left=None, right=None):self.value = valueself.left = leftself.right = rightclass Solution:def __init__(self):self.max_length = 0def longestZigZag(self, root: TreeNode) -> int:def dfs(node, direction, length):if not node:returnself.max_length = max(self.max_length, length)if direction == 'left':dfs(node.left, 'left', 1) # 重置左边路径长度dfs(node.right, 'right', length + 1) # 继续增加右边路径长度else:dfs(node.left, 'left', length + 1) # 继续增加左边路径长度dfs(node.right, 'right', 1) # 重置右边路径长度dfs(root, 'left', 0)dfs(root, 'right', 0)return self.max_length# 示例二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.right = TreeNode(4)
root.left.right.left = TreeNode(5)
root.left.right.right = TreeNode(6)# 计算最长交错路径
solution = Solution()
result = solution.longestZigZag(root)
print("最长交错路径长度:", result)
关键点总结
二叉树节点类:用于表示树的结构。
深度优先搜索(DFS):用于遍历二叉树。
递归:在每个节点记录路径的长度,并更新最长交错路径的长度。
方向标志:用 direction 参数来指示当前路径的方向(左或右),并在递归调用时进行交替。
路径长度记录:用 length 参数来记录当前路径的长度,并更新 self.max_length 以记录最长路径的长度。
通过这些步骤,可以有效地计算出二叉树中最长的交错路径。
GO语言实现
package mainimport "fmt"// TreeNode 表示二叉树的节点
type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode
}// Solution 结构体用于记录最长交错路径的长度
type Solution struct {maxLength int
}// NewSolution 初始化 Solution
func NewSolution() *Solution {return &Solution{maxLength: 0}
}// dfs 递归函数遍历二叉树
func (s *Solution) dfs(node *TreeNode, direction string, length int) {if node == nil {return}// 更新最长路径长度if length > s.maxLength {s.maxLength = length}if direction == "left" {s.dfs(node.Left, "left", 1) // 重置左边路径长度s.dfs(node.Right, "right", length+1) // 继续增加右边路径长度} else {s.dfs(node.Left, "left", length+1) // 继续增加左边路径长度s.dfs(node.Right, "right", 1) // 重置右边路径长度}
}// LongestZigZag 计算二叉树的最长交错路径
func (s *Solution) LongestZigZag(root *TreeNode) int {s.dfs(root, "left", 0)s.dfs(root, "right", 0)return s.maxLength
}func main() {// 构建示例二叉树root := &TreeNode{Val: 1}root.Left = &TreeNode{Val: 2}root.Right = &TreeNode{Val: 3}root.Left.Right = &TreeNode{Val: 4}root.Left.Right.Left = &TreeNode{Val: 5}root.Left.Right.Right = &TreeNode{Val: 6}// 计算最长交错路径solution := NewSolution()result := solution.LongestZigZag(root)fmt.Println("最长交错路径长度:", result)
}
kotlin实现
class TreeNode(val value: Int) {var left: TreeNode? = nullvar right: TreeNode? = null
}class Solution {private var maxLength = 0private fun dfs(node: TreeNode?, direction: String, length: Int) {if (node == null) return// 更新最长路径长度if (length > maxLength) {maxLength = length}if (direction == "left") {dfs(node.left, "left", 1) // 重置左边路径长度dfs(node.right, "right", length + 1) // 继续增加右边路径长度} else {dfs(node.left, "left", length + 1) // 继续增加左边路径长度dfs(node.right, "right", 1) // 重置右边路径长度}}fun longestZigZag(root: TreeNode?): Int {dfs(root, "left", 0)dfs(root, "right", 0)return maxLength}
}fun main() {// 构建示例二叉树val root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left?.right = TreeNode(4)root.left?.right?.left = TreeNode(5)root.left?.right?.right = TreeNode(6)// 计算最长交错路径val solution = Solution()val result = solution.longestZigZag(root)println("最长交错路径长度: $result")
}相关文章:
leetcode--二叉树中的最长交错路径
leetcode地址:二叉树中的最长交错路径 给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下: 选择二叉树中 任意 节点和一个方向(左或者右)。 如果前进方向为右,那么移动到当前节点的的右子节点&…...
c++ primer plus 第15章友,异常和其他:15.1.3 其他友元关系
c primer plus 第15章友,异常和其他:15.1.3 其他友元关系 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 15.1.3 其他友元关系 提示:写完文章后,目录可以自动生成,如何生成可…...
uniapp+vue3页面跳转和传参
页面跳转: uni.navigateTo({url: /pages/index}) 返回上一层: uni.navigateBack ({delta: 1 }) 页面跳转时传参: 跳转前的页面: uni.navigateTo({url: "/pages/index?id123"}) 跳转后的页面: onLoa…...
硬链接和软链接
在Linux系统中,链接(Link)是一种特殊的文件,它指向另一个文件或目录。链接分为两种类型:硬链接(Hard Link)和软链接(也称为符号链接,Symbolic Link)。 1. 硬…...
属性描述符初探——Vue实现数据劫持的基础
目录 属性描述符——Vue实现数据劫持的基础 一、属性描述符是什么? 编辑 1.1、属性描述符示例 1.2、用属性描述符定义属性及获取对象的属性描述符 1.3、带有读取器和设置器的属性描述符 二、使用属性描述符的情景 2.1、封装和数据隐藏 使用getter和setter…...
字节也没余粮了?天底下没有永远免费的GPT-4;AI产品用订阅制就不合理!让用户掏钱的N种定价技巧嘿嘿 | ShowMeAI日报
👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 当 Coze 也开始收费:天底下没有「永远」免费的 GPT-4 注:这里 Coze 指海外版。国内版 扣子 还是免费。 Coze (海外版) 官网链接 → htt…...
【Matlab 路径优化】基于蚁群算法的XX市旅游景点线路优化系统
基于蚁群算法的XX市旅游景点线路优化系统 (一)客户需求: ①考虑旅游景点的空间分布、游客偏好等因素,实现了旅游线路的智能规划 ②游客选择一景点出发经过所要游览的所有景点只一次,最后回到出发点的前提下…...
我关于Excel使用点滴的笔记
本篇笔记是我关于Excel使用点滴的学习笔记,摘要和地址链接列表。临时暂挂,后面可能在不需要时删除。 (笔记模板由python脚本于2024年06月28日 12:23:32创建,本篇笔记适合初通Python,熟悉六大基本数据(str字符串、int整型、float浮…...
【Java安装】windows10+JDK21+IDEA
文章目录 一、JDK安装1. 下载完成后按照自己需要的位置安装2. 配置环境变量2.1 JAVA_HOME变量2.2 PATH配置 3. 验证4. helloworld 二、IDEA安装三、IDEA-HelloWorld 一、JDK安装 JDK安装链接 1. 下载完成后按照自己需要的位置安装 2. 配置环境变量 2.1 JAVA_HOME变量 安装…...
《简历宝典》01 - 一文带你学会如何写一份糟糕透顶的简历
我们每个人几乎都会面对找工作这件事,而找工作或者说求职首先就是要写一份简历。今天狗哥将以一个不同的视角带你写一份无与伦比,糟糕透顶的求职简历,说实话,其实几年前,我就是这么写的。 目录 1. 文件名 2. 基本信…...
多链路聚合通信路由在应急救援活动中的重要性及解决方案
在应急救援指挥活动中,多链路聚合通信设备如同一座坚固的桥梁,将信息快速、准确地传递至每一个角落。面对复杂多变的救援现场,这类设备展现了其卓越的适应性和稳定性。 想象一下,当灾害突然降临,信息的传递变得至关重…...
PyCharm中如何将某个文件设置为默认运行文件
之前在使用JetBrain公司的另一款软件IDEA的时候,如果在选中static main函数后按键altenter可以默认以后运行Main类的main函数。最近在使用PyCharm学习Python,既然同为一家公司的产品而且二者的风格如此之像,所以我怀疑PyCharm中肯定也有类似的…...
【杂交版】植物大战僵尸杂交版v2.1最新版本下载链接
B站游戏作者潜艇伟伟迷于6月13日中午更新了植物大战僵尸杂交版2.1版本,有老版本的也可以完美继承存档数据。 不多废话下载链接放上: 夸克网盘链接:https://pan.quark.cn/s/095de551d1d1 UC网盘链接:https://drive.uc.cn/s/86debb3…...
图像增强及运算篇之图像掩膜直方图和HS直方图
一.图像掩膜直方图 如果要统计图像的某一部分直方图,就需要使用掩码(蒙板)来进行计算。假设将要统计的部分设置为白色,其余部分设置为黑色,然后使用该掩膜进行直方图绘制,其完整代码如下所示。 # -*- codi…...
Python商务数据分析知识专栏(六)——Python数据分析的应用④Python数据分析实训
Python商务数据分析知识专栏(六)——Python数据分析的应用④Python数据分析实训 Python数据分析实训一.iris数据处理实训1.1 拓展学习资料&Python环境介绍1.2 读取数据&修改列名称1.3 以PythonConsole方式执行代码1.4 缺失值处理1.5 重置索引 二…...
【Python机器学习】处理文本数据——将文本数据表示为词袋
用于机器学习的文本有一种最简单的方法,也是最有效且最常用的方法,就是使用词袋表示。使用这种表示方法时,我们舍弃了输入文本中的大部分结构,比如章节、段落、句子和格式,只计算语料库中,只计算语料库中每…...
论文写作全攻略:Kimi辅助下的高效学术写作技巧
学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 完成论文写作是一个多阶段的过程,涉及到不同的任务和技能。以下是按不同分类总结的向Kimi提问的prompt,以帮助你在论文写作过程中取得成功: 1. 选题与…...
通证经济重塑经济格局
在数字化转型的全球浪潮中,通证经济模式犹如一股新兴力量,以其独特的价值传递与共享机制,重塑着经济格局,引领我们步入数字经济的新纪元。 通证,作为这一模式的核心,不仅是权利与权益的数字化凭证…...
linux - cp 命令
问:cp -r ./src/. ./dst 与 cp -r ./src/* ./dst 有什么区别? 1.隐藏文件和目录:cp -r ./src/* ./dst 不会复制隐藏文件和目录。cp -r ./src/. ./dst 会复制所有文件和目录,包括隐藏文件和目录。 2.通配符和当前目录:* 是一个通…...
基于Qt实现的PDF阅读、编辑工具
记录一下实现pdf工具功能 语言:c、qt IDE:vs2017 环境:win10 一、功能演示: 二、功能介绍: 1.基于saribbon主体界面框架,该框架主要是为了实现类似word导航项 2.加载PDF放大缩小以及预览功能 3.pdf页面跳转…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
