当前位置: 首页 > news >正文

代码随想录第14天:(二叉树)

一、找树左下角的值(Leetcode 513)

递归法:

class Solution:def findBottomLeftValue(self, root: TreeNode) -> int:# 初始化最大深度为 -1,表示当前尚未遍历任何节点# 初始化 result 为 None,最终将存储最左边的节点值self.max_depth = -1  self.result = None# 从根节点开始深度优先遍历,初始深度为 0self.traversal(root, 0)# 返回遍历过程中记录的最左边节点的值return self.resultdef traversal(self, node, depth):# 如果当前节点为空,直接返回(递归结束条件)if not node:return# 如果当前节点的深度比最大深度大,说明找到了一个新的最深层# 更新最大深度和当前深度下最左边的节点值if depth > self.max_depth:self.max_depth = depthself.result = node.val  # 记录当前深度的最左边节点值# 先递归遍历左子树,再遍历右子树# 左子树会先被访问,因此最左边的节点会先被更新为 result# 递归调用时,深度加 1self.traversal(node.left, depth + 1)# 同样,递归调用右子树,深度也加 1self.traversal(node.right, depth + 1)

迭代法:

from collections import dequeclass Solution:def findBottomLeftValue(self, root):# 如果树为空,返回 0if root is None:return 0# 使用双端队列来实现队列操作,支持 O(1) 的 popleft 操作queue = deque()# 将根节点添加到队列中queue.append(root)# 记录最左边节点的值,初始为 0result = 0# 开始广度优先遍历(层序遍历)while queue:# 获取当前队列的大小,即当前层的节点数size = len(queue)# 遍历当前层的所有节点for i in range(size):# 从队列中弹出一个节点node = queue.popleft()# 如果是当前层的第一个节点,则更新 result 为该节点的值if i == 0:result = node.val# 如果当前节点有左子节点,将左子节点加入队列if node.left:queue.append(node.left)# 如果当前节点有右子节点,将右子节点加入队列if node.right:queue.append(node.right)# 返回最左边的节点值(最底层最左的节点)return result

二、路径总和I(Leetcode 112)

遍历的路线,并不要遍历整棵树,所以递归函数需要返回值,可以用bool类型表示。

class Solution:# 递归辅助函数:遍历树的每一条路径def traversal(self, cur: TreeNode, count: int) -> bool:# 1. 如果当前节点是叶子节点,并且路径和等于0,返回 Trueif not cur.left and not cur.right and count == 0:  # 叶子节点且路径和为0return True# 2. 如果是叶子节点,但路径和不为0,返回 Falseif not cur.left and not cur.right:  # 叶子节点,但路径和不为0return False# 3. 否则,继续遍历左右子树# 处理左子树if cur.left:  # 如果有左子树count -= cur.left.val  # 减去当前节点的值,递归检查左子树if self.traversal(cur.left, count):  # 递归调用左子树return True  # 如果左子树存在符合条件的路径,直接返回 Truecount += cur.left.val  # 回溯,撤销左子树的减法# 处理右子树if cur.right:  # 如果有右子树count -= cur.right.val  # 减去当前节点的值,递归检查右子树if self.traversal(cur.right, count):  # 递归调用右子树return True  # 如果右子树存在符合条件的路径,直接返回 Truecount += cur.right.val  # 回溯,撤销右子树的减法# 如果左右子树都没有符合的路径,返回 Falsereturn False# 主函数:判断从根节点到叶子节点是否有路径和为 targetSumdef hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:if root is None:  # 空树没有路径return False# 从根节点开始递归,路径和初始化为 targetSum - root.valreturn self.traversal(root, targetSum - root.val)



三、路径总和II (Leetcode 113)

路径总和ii要遍历整个树,找到所有路径,所以递归函数不要返回值!

class Solution:def __init__(self):# 初始化结果列表和路径列表self.result = []  # 存储所有符合条件的路径self.path = []  # 存储当前路径def traversal(self, cur, count):# 1. 遇到叶子节点且路径和等于目标和if not cur.left and not cur.right and count == 0:# 如果是叶子节点,且路径和符合条件,记录当前路径self.result.append(self.path[:])  # 将当前路径复制到结果中return# 2. 遇到叶子节点但路径和不为0,直接返回if not cur.left and not cur.right:return# 3. 递归遍历左子树if cur.left:self.path.append(cur.left.val)  # 将左子节点的值加入路径count -= cur.left.val  # 更新路径和self.traversal(cur.left, count)  # 递归遍历左子树count += cur.left.val  # 回溯:撤销对路径和的修改self.path.pop()  # 回溯:从路径中移除最后一个节点# 4. 递归遍历右子树if cur.right:self.path.append(cur.right.val)  # 将右子节点的值加入路径count -= cur.right.val  # 更新路径和self.traversal(cur.right, count)  # 递归遍历右子树count += cur.right.val  # 回溯:撤销对路径和的修改self.path.pop()  # 回溯:从路径中移除最后一个节点returndef pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:# 清空结果和路径,以确保每次调用时数据是干净的self.result.clear()self.path.clear()# 如果根节点为空,返回空结果if not root:return self.result# 先将根节点的值加入路径self.path.append(root.val)# 从根节点开始递归,更新路径和为 targetSum - 根节点的值self.traversal(root, targetSum - root.val)# 返回所有符合条件的路径return self.result

四、从中序与后序遍历序列构造二叉树(Leetcode 106)

相关文章:

代码随想录第14天:(二叉树)

一、找树左下角的值(Leetcode 513) 递归法: class Solution:def findBottomLeftValue(self, root: TreeNode) -> int:# 初始化最大深度为 -1,表示当前尚未遍历任何节点# 初始化 result 为 None,最终将存储最左边的…...

TCP/UDP的连接和数据发送过程详解

TCP TCP三次握手 在服务端启动好后会调用 listen() 方法,进入到 LISTEN 状态,然后静静等待客户端的连接请求到来。 而此时客户端主动调用 connect(IP地址) ,就会向某个IP地址发起第一次握手,会先建立个半连接,发送SYN…...

2. 单词个数统计

【问题描述】 编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数。例如,对于句子“one little two little three little boys",总共有5个不同的单词,one, little, two, three, boys。 说明&…...

Js生成螺旋数组。

这段代码定义了一个名为 vetux 的函数,用于生成一个螺旋矩阵。螺旋矩阵是一种按照螺旋顺序填充数字的二维数组。以下是代码的详细解释: 函数定义 function vetux(n, m) {// 创建一个 m 行 n 列的二维数组,初始值为 0const a new Array(m).…...

《Vue.js组件化开发实战:从安全纵深到性能跃迁》

开篇:组件化开发的工业革命 当全球500强企业的核心业务系统在12.12大促中经受每秒38万次请求冲击时,我们突然意识到:现代前端组件已不再是简单的UI积木,而是承载业务逻辑、安全防护、性能优化的纳米级作战单元。本文将从军工级系统…...

【Git】--- 多人协作实战场景

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: Git 前面我们学习了Git的所有本地仓库的相关操作:git基本操作,分支理解,版本回退,冲突解决等等。同时我们还理解了远端仓库在开发的作用以及相关操作push…...

SmolVLM2: The Smollest Video Model Ever(二)

这是对论文《SmolVLM: Redefining small and efficient multimodal models》的整理与翻译 SmolVLM:重新定义小型高效的多模态模型 拥抱脸、斯坦福大学 图1 小而强大:SmolVLM与其他最先进的小型视觉语言模型(VLM)的比较。图像结果来…...

如何通过前端表格控件实现自动化报表?1

背景 最近伙伴客户的项目经理遇见一个问题,他们在给甲方做自动化报表工具,项目已经基本做好了,但拿给最终甲方,业务人员不太买账,项目经理为此也是天天抓狂,没有想到合适的应对方案。 现阶段主要面临的问…...

数据库8(函数,变量)

1.数据类型 char(10):不足十个字符,用空格补全,数据定长;非统一字符编码,一个汉字要占两位char(2) nchar(10):不足十个字符,用空格补全,数据定长;统一字符编码,一个汉字占一位 nch…...

电阻式传感器(三)——电位器式传感器等效电路分析

(1)电位器式传感器的基本工作原理 将机械位移或其他可转换为位移变化的非电量转换为与其有一定函数关系的电阻变化,从而引起输出电压变化。 类型 基本结构 旋转型 直线型 非线性型 (2)电位器式传感器的等效电路分析 电位器式传感器的核…...

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

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

力扣刷题——1339.分裂二叉树的最大乘积

给你一棵二叉树,它的根为 root 。请你删除 1 条边,使二叉树分裂成两棵子树,且它们子树和的乘积尽可能大。 由于答案可能会很大,请你将结果对 10^9 7 取模后再返回。 示例 1: 输入:root [1,2,3,4,5,6] 输…...

Pytest+Allure+Excel接口自动化测试框架实战

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允…...

交易所开发全流程解析:KYC与U盾在安全合规中的战略价值

——2025年加密资产交易平台的技术架构与风控体系深度实践 一、交易所开发的核心技术架构与流程 1. 系统定位与合规基础 交易所开发需首先明确中心化(CEX)、去中心化(DEX)或混合架构的定位。中心化交易所(如币安&…...

简单了解一下Unity的Resources.UnloadUnusedAssets

基本概念 Resources.UnloadUnusedAssets()是Unity提供的一个内存管理方法,用于卸载当前未被任何GameObject引用的资源,包括贴图、材质、网格、音频等资源。 在Unity中,资源在加载后会占用内存,而当这些资源不再被场景中的对象引…...

ECMAScript 7~10 新特性

ECMAScript 7 新特性 ECMAScript 6 新特性(一) ECMAScript 6 新特性(二) ECMAScript 7~10 新特性(本文) 1. 数组方法 Array.prototype.includes() 用来检测数组中是否包含指定元素,返回布尔值&…...

leetcode_1. 两数之和_java

1. 两数之和https://leetcode.cn/problems/two-sum/ 1、题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你…...

Mysql索引(四)

1、B树:B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树、B_树。是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找、插入和删除; 1)每个节点占用一个盘块的磁盘空间&#x…...

力扣——【1991. 找到数组的中间位置】

#前缀和思想 主要利用递推的思想,将数列的前n!项和存到一个新数列中,递推公式可能需要自己推导 一个数列的值等于另一个数列的第i个元素加上这一个数列的第i-1个元素 同时需要初始化这个数列的第一个元素另一个数列的第一个元素 #思路 本…...

在 Linux 系统(ubuntu/kylin)上安装 Docker

在 Linux 系统上安装 Docker 的步骤如下(以 Ubuntu/Debian 和 CentOS/RHEL 为例): 请用./check-config config检查内核是否支持,necessarily 必须全部enable。 以下是脚本自行复制运行: #!/usr/bin/env sh set -eEXITCODE=0# bits of this were adapted from lxc-checkco…...

【实证分析】数智化转型对制造企业全要素生产率的影响及机制探究(1999-2023年)

数智化转型是实现数字经济与实体经济深度融合,推动制造企业高质量可持续发展的必然选择,也是加快新质生产力发展的重要抓手。参照宋冬林(2025)的做法,对来自科技进步与对策《数智化转型对制造企业全要素生产率的影响及机制探究——基于中国制…...

lower_bound

在C中,lower_bound 返回的是一个迭代器(iterator),而不是直接的下标位置。因此,为了得到数组中的索引(即 pos1),你需要用返回的迭代器减去数组的起始地址(num&#xff09…...

biblatex 的 Biber 警告​​:tex文件运行无法生成参考文献和目录

原因​​:使用了 biblatex 管理参考文献,但未运行 biber 生成参考文献数据。 ​​解决​​:更新 LaTeX Workshop 配置 修改你的 settings.json,添加 biber 工具并更新编译流程: {"latex-workshop.latex.tools&…...

解锁 MCP:模型上下文协议的介绍与应用​,技术解析与应用场景

欢迎来到涛涛聊AI,这几天MCP很火,咱们一起学习下吧。 一、什么是 MCP MCP,即 Model Context Protocol(模型上下文协议),是由 Anthropic 推出的一个具有创新性的开放协议 。它的核心目标是统一 LLM 应用与外部数据源和工具之间的通信方式,为 AI 开发打造标准化的上下文…...

十二种存储器综合对比——《器件手册--存储器》

存储器 名称 特点 用途 EEPROM 可电擦除可编程只读存储器,支持按字节擦除和写入操作,具有非易失性,断电后数据不丢失。 常用于存储少量需要频繁更新的数据,如设备配置参数、用户设置等。 NOR FLASH 支持按字节随机访问&…...

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

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

App Cleaner Pro for Mac 中 Mac软件卸载工具

App Cleaner Pro for Mac 中 Mac软件卸载工具 一、介绍 App Cleaner & Uninstaller Pro Mac破解,是一款Mac软件卸载工具,残余垃圾清除工具!可以卸载应用程序或只删除不需要的服务文件,甚至可以删除以前删除的应用程序中的文…...

【操作系统】线程同步:原理、方法与实践

一、线程同步的核心概念 1.1 为什么需要线程同步? 在多线程环境中,当多个线程并发访问共享资源(如内存、文件、数据库等)时,可能会引发数据竞争(Race Condition),导致数据不一致或…...

vue实现二维码生成器和解码器

vue实现二维码生成器和解码器 1.生成基本二维码:根据输入的value生成二维码。 2.可定制尺寸:通过size调整大小。 3.颜色和背景色:设置二维码颜色和背景。 4.静区(quiet zone)支持:通过quietZone调整周围的…...

p2p的发展

PCDN(P2P内容分发网络)行业目前处于快速发展阶段,面临机遇与挑战并存的局面。 一、发展机遇 技术融合推动 边缘计算与5G普及:5G的高带宽、低延迟特性与边缘计算技术结合,显著提升PCDN性能,降低延迟&#x…...

DeepSeek提示词实战大全:提示词合集和使用技巧

大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 更多文章可关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能! 【数据集篇】更多阅读: 大语言模型常见任务及评测数据集…...

23种设计模式生活化场景,帮助理解

以下是 23种设计模式的生活化场景 及其核心对比,通过日常例子和比喻帮助理解它们的本质区别和应用场景: 创建型模式(5种) 1. 工厂方法(Factory Method) • 场景:快餐店的点餐系统。 • 问题&a…...

Kotlin 学习-方法和参数类型

/*** kotlin 的方法有三种* */fun main() {/*** 方法一* 1.普通类的成员方法申明与调用* (1)需要先构建出实例对象,才能访问成员方法* (2)实例对象的构建只需要在类名后面加上()* */Person().test()/*** 方法二&#x…...

Java 解析日期格式各个字段含义温习

背景 今天解析了一个不常见的日期格式 「10-Mar-2025 16:30:47.869」,对应的 Java 日期格式是 dd-MMM-yyyy HH:mm:ss.SSS ,而且跟 Local 语言环境有关。 本文记录这个简单的解析过程,顺便回忆一下日期格式各个字段。毕竟平时只用了常见的 y…...

OpenBayes 一周速览|1分钟生成完整音乐,DiffRhythm人声伴奏一键搞定; Stable Virtual Camera重塑3D视频创作

公共资源速递 5 个数据集: * 302 例罕见病病例数据集 * DRfold2 RNA 结构测试数据集 * NaturalReasoning 自然推理数据集 * VenusMutHub 蛋白质突变小样本数据集 * Bird Vs Drone 鸟类与无人机图像分类数据集 2 个模型: * Qwen2.5-0mni * Llama…...

SpringBoot 数据库MySql的读写分离 多数据源 Shardingsphere高并发优化

介绍 传统的 MySQL 架构中,所有的数据库操作(包括读操作和写操作)都在同一个数据库实例上进行。随着应用程序的规模增长,单一数据库实例可能会成为瓶颈,无法满足高并发的需求。为了优化性能,可以将数据库的…...

SQLI漏洞公开报告分析

文章目录 1. 闭合 )2. 邀请码|POST参数|时间盲注 | **PostgreSQL**3. POST|order by参数|布尔盲注|Oracle4. SOAP请求|MSSQL|布尔盲注5. MySQL 时间盲注漏洞6. GET|普通回显注入7. ImpressCMS 1.4.2 | CVE | POST | 布尔盲注8. Mysql | post | 布尔/时间盲注9. 登录口 | post |…...

并行和并发有什么区别?

1. 定义 并行是在同一时刻执行多个任务。并发是在相同的时间段内执行多个任务,任务可能交替执行,通过调度实现。 2. 区别 执行方式: 并发:多个任务交替进行,任务并不一定同时执行,只是在同一时间段内处理…...

Elasticsearch 全面解析

Elasticsearch 全面解析 前言一、简介核心特性应用场景 二、核心原理与架构设计1. 倒排索引(Inverted Index)2. 分片与副本机制(Sharding & Replication)3. 节点角色与集群管理 三、核心特点1. 灵活的查询语言(Que…...

SQL 中的 NULL 处理

NULL 在 SQL 中表示缺失、未知或不适用的数据值,它与空字符串或零值不同。SQL 对 NULL 有特殊的处理规则: NULL 的基本特性 比较运算:任何与 NULL 的比较都返回 UNKNOWN(既不是 TRUE 也不是 FALSE) SELECT * FROM tab…...

2025常用的ETL 产品推荐:助力企业激活数据价值

在当今数字化时代,企业面临着海量数据的挑战与机遇,ETL(Extract, Transform, Load)工具作为数据整合与分析的关键环节,其重要性日益凸显。ETL 厂商众多,各有优势,本文将从多个维度进行分析&…...

深入解析:Python 爬取淘宝商品券后价

在电商领域,淘宝作为国内领先的电商平台,拥有海量的商品和丰富的优惠活动。对于技术开发者来说,获取淘宝商品的券后价是实现电商应用功能的重要环节。本文将详细介绍如何通过淘宝开放平台的 API 接口获取商品的券后价,并提供实际的…...

25.4.10学习总结

关于消除警告 警告: Loading FXML document with JavaFX API of version 23.0.1 by JavaFX runtime of version 17.0.6 对应这条警告,我的处理方式是,将IDEA的默认javaFX的库换成自己下载的javaFX的库。 我用的javaFX的库如下: javaFX-24…...

【XML基础-2】深入理解XML中的语义约束:DTD详解

XML(可扩展标记语言)作为数据交换的标准格式,在Web服务和应用程序间数据传递中扮演着重要角色。而确保XML文档结构正确性和语义一致性的关键,就在于文档类型定义(DTD)。本文将全面解析DTD的概念、语法结构、…...

SkyWalking + ELK 全链路监控系统整合指南

一、架构设计图 二、核心组件部署 1. SkyWalking 集群部署 yaml: # docker-compose-skywalking.yml version: 3.8services:oap:image: apache/skywalking-oap-server:9.7.0ports:- "11800:11800" # gRPC- "12800:12800" # HTTPenvironment:SW_STORAGE: …...

LeetCode hot 100—编辑距离

题目 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 示例 示例 1: 输入:word1 "horse", word2 &q…...

SAP系统年终结算出错

问题描述:2024年采购订单发票校验过账到2024年时提示错误如下: 问题原因:2024年全部未结束的采购申请和订单被结转到2025年。 解决方法:用事务代码FMJ3冲销此采购订单结转。...

在 Dev-C++中编译运行GUI 程序介绍(二)示例:祝福程序

在 Dev-C中编译运行GUI 程序介绍(二)示例:祝福程序 前期见: 在 Dev-C中编译运行GUI 程序介绍(一)基础 https://blog.csdn.net/cnds123/article/details/147019078 示例1、祝福程序 本文中的这个祝福程序是…...

Uniapp使用onShow语法报before initialization

一、错误原因分析 函数未完成初始化时被调用 • 当你在 onShow 生命周期中调用 getUserMessagePlan() 时,如果该函数的定义位于调用代码的下方(如示例中的顺序),JavaScript 引擎会因 变量提升规则 抛出此错误。 • 示例代码结构&a…...

大模型在儿童急性淋巴细胞白血病(ALL)-初治患者诊疗中应用的研究报告

目录 一、绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与内容 二、大模型技术与儿童 ALL 相关知识 2.1 大模型技术原理与特点 2.2 儿童 ALL 的病理生理与诊疗现状 三、术前风险预测与手术方案制定 3.1 术前数据收集与预处理 3.2 大模型预测术前风险 3.…...