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

二叉树的构造、合并与二叉搜索树

文章目录二叉树的构造、合并与二叉搜索树1. 引入为什么要学习这些2. 二叉树的构造2.1 从中序与后序遍历构造二叉树2.2 从前序与中序遍历构造二叉树3. 二叉树的合并4. 二叉搜索树BST——从无序到有序4.1 从一个生活场景引入4.2 BST的核心思想大小关系决定位置4.3 BST的核心操作不讲代码主讲思路查找像查字典一样插入找到空位就坐删除最难的操作4.4 BST的灵魂中序遍历4.5 什么时候用BST5. 从有序数组构造平衡BST6. 总结对比表7. 易错点总结二叉树的构造、合并与二叉搜索树1. 引入为什么要学习这些在解决实际问题时我们常常需要面对这样的场景发现了某棵二叉树的中序和后序遍历记录如何还原这棵树的原貌图像处理中需要将两张重叠的图片融合对应到二叉树就是节点的合并数据库索引为什么能快速查找数据秘密就在于二叉搜索树的结构这些问题看似不同但核心都是二叉树的结构操作。掌握它们你就能真正理解二叉树的灵魂。2. 二叉树的构造2.1 从中序与后序遍历构造二叉树106. 从中序与后序遍历序列构造二叉树 - 力扣LeetCode核心原理要理解这个构造过程先看两种遍历的特点遍历方式顺序特点中序遍历左 → 根 → 右根节点把左右子树分开后序遍历左 → 右 → 根最后一个节点一定是根节点图解过程以这棵树为例3 / \ 9 20 / \ 15 7中序[9, 3, 15, 20, 7]后序[9, 15, 7, 20, 3]构造步骤后序最后一个3是根节点在中序中找到3左边[9]是左子树右边[15,20,7]是右子树左子树中序[9]后序[9]→ 节点9右子树中序[15,20,7]后序[15,7,20]→ 递归构建代码实现structTreeNode*build(int*inorder,int*postorder,intinStart,intinEnd,intpostStart,intpostEnd){if(inStartinEnd||postStartpostEnd){// 递归终止条件区间无效returnNULL;}introotValuepostorder[postEnd];// 后序最后一个节点是当前子树的根structTreeNode*root(structTreeNode*)malloc(sizeof(structTreeNode));root-valrootValue;intposition;// 在中序中找到根的位置for(positioninStart;positioninEnd;position){if(inorder[position]rootValue){break;}}intleftSizeposition-inStart;// 关键计算左子树的节点数root-leftbuild(inorder,postorder,inStart,position-1,postStart,postStartleftSize-1);// 递归构建左右子树root-rightbuild(inorder,postorder,position1,inEnd,postStartleftSize,postEnd-1);returnroot;}structTreeNode*buildTree(int*inorder,intinorderSize,int*postorder,intpostorderSize){if(inorderSize0||postorderSize0){returnNULL;}returnbuild(inorder,postorder,0,inorderSize-1,0,postorderSize-1);}关键点解析leftSize position - inStart左子树节点数后序区间划分左子树[postStart, postStartleftSize-1]右子树[postStartleftSize, postEnd-1]中序区间划分左子树[inStart, position-1]右子树[position1, inEnd]额这个范围感觉难记的话我都是写的时候边画图边数的2.2 从前序与中序遍历构造二叉树105. 从前序与中序遍历序列构造二叉树 - 力扣LeetCode核心原理前序[根, 左子树, 右子树]→ 第一个是根中序[左子树, 根, 右子树]思路与前后构造类似只是根的位置在前序第一个// 原理类似3. 二叉树的合并617. 合并二叉树 - 力扣LeetCode问题给定两棵二叉树将它们合并成一棵新树。合并规则如下如果两个节点重叠新节点值为两节点值之和否则不为NULL的节点直接作为新树的节点图解Tree1 Tree2 合并后 1 2 3 / \ / \ / \ 3 2 1 3 4 5 / \ / \ 5 4 5 4递归思路如果root1为空返回root2如果root2为空返回root1都不为空创建新节点值为两节点和递归合并左子树和右子树代码实现structTreeNode*mergeTrees(structTreeNode*root1,structTreeNode*root2){if(root1NULL){// 处理一方为空的情况returnroot2;}if(root2NULL){returnroot1;}structTreeNode*new(structTreeNode*)malloc(sizeof(structTreeNode));// 都不为空创建新节点new-valroot1-valroot2-val;new-leftmergeTrees(root1-left,root2-left);// 递归合并左右子树new-rightmergeTrees(root1-right,root2-right);returnnew;}复杂度分析时间复杂度O(min(n, m))n和m为两棵树节点数空间复杂度O(min(h1, h2))递归栈深度4. 二叉搜索树BST——从无序到有序4.1 从一个生活场景引入想象你在整理书架如果书是按随机顺序摆放的找一本书需要一本本翻过去O(n)如果书是按拼音顺序摆放的你可以用二分法快速定位BST就是二叉树的按拼音顺序摆放——它让查找从O(n)变成了O(h)。4.2 BST的核心思想大小关系决定位置定义三句话比代码更重要对于任意节点左子树所有节点都比它小右子树所有节点都比它大左右子树也满足这两条图解对比普通二叉树 二叉搜索树 5 5 / \ / \ 3 8 3 8 / \ / \ / \ \ 1 4 7 9 1 4 9 \ \ 6 7?在BST中7不能放在9的右边因为79应该去9的左子树。这就是规则的力量。4.3 BST的核心操作不讲代码主讲思路查找像查字典一样思路比当前节点小去左子树比当前节点大去右子树相等找到了为什么快每走一步搜索范围就减半——这就是树的二分查找。插入找到空位就坐思路和查找一模一样只是最后一步——找到空位了就坐在这里关键理解插入的新节点永远在叶子位置不会破坏树的结构删除最难的操作删除为什么复杂因为要维持BST的性质。三种情况用生活比喻情况生活比喻处理方法删叶子公司里最底层的员工离职直接让他走没人受影响删单支节点一个主管离职他手下有个员工让这个员工直接顶替主管位置删双支节点一个经理离职手下有两个主管找个合适的人来接替通常是右子树里最小的那个主管图解双支节点删除删除38 / \ 3 10 / \ \ 2 6 14 / / \ / 1 4 7 13 \ 5步骤找到3节点判断3节点的左右子树情况都为空左空右空都存在按照判断进行删除操作如果判断为左右都存在那么先找到3节点右子树中的最小节点即4并将其替换3。即8 / \ 4 10 / \ \ 2 6 14 / / \ / 1 ? 7 13 \ 5最后继续递归将“”的位置删除即可。4.4 BST的灵魂中序遍历这是BST最神奇的性质对BST进行中序遍历得到的是递增序列5 / \ 3 8 / \ \ 1 4 9 中序遍历1,3,4,5,8,9 递增这意味着要判断一棵树是不是BST中序遍历看是否递增要把BST转成有序数组中序遍历要找BST的第k小元素中序遍历到第k个4.5 什么时候用BST适合数据是动态插入删除的数据需要有序性范围查询、第k小元素插入顺序比较随机不适合数据是静态的数组二分查找更快插入顺序有序会退化成链表只需要查找5. 从有序数组构造平衡BST108. 将有序数组转换为二叉搜索树 - 力扣LeetCode问题给定有序数组构造一棵高度平衡的二叉搜索树思路每次取中间元素作为根递归构建左右子树图解数组[-10, -3, 0, 5, 9] 0 / \ -3 9 / / -10 5代码实现structTreeNode*buildBST(int*nums,intleft,intright){if(leftright)returnNULL;intmidleft(right-left)/2;// 取中间元素作为根structTreeNode*root(structTreeNode*)malloc(sizeof(structTreeNode));root-valnums[mid];root-leftbuildBST(nums,left,mid-1);// 递归构建左右子树root-rightbuildBST(nums,mid1,right);returnroot;}structTreeNode*sortedArrayToBST(int*nums,intnumsSize){if(numsSize0)returnNULL;returnbuildBST(nums,0,numsSize-1);}6. 总结对比表操作核心思想关键点时间复杂度中后构造后序定根中序分左右计算左子树大小O(n²)找根位置合并二叉树同步递归遍历处理空节点O(min(n,m))BST验证中序遍历递增严格递增判断O(n)BST查找利用大小关系每次减少一半O(h)BST插入找到空位插入保持BST性质O(h)BST删除分三种情况处理双子节点找后继O(h)有序数组→BST二分递归取中间元素O(n)注h为树高最坏O(n)最好O(log n)7. 易错点总结构造时下标计算中序找根时左子树长度 根索引 - 中序起始后序区间划分右子树后序结束位置是postEnd - 1因为最后一个是根合并时的空指针处理先判断一方为空的情况避免空指针访问BST验证的严格性必须是严格递增就不行BST删除双子节点替换后要递归删除那个被替换的节点递归终止条件什么时候返回NULL什么时候返回节点

相关文章:

二叉树的构造、合并与二叉搜索树

文章目录二叉树的构造、合并与二叉搜索树1. 引入:为什么要学习这些?2. 二叉树的构造2.1 从中序与后序遍历构造二叉树2.2 从前序与中序遍历构造二叉树3. 二叉树的合并4. 二叉搜索树(BST)——从无序到有序4.1 从一个生活场景引入4.2…...

27.3k stars!Fish Speech:开源 TTS 的天花板,10 秒克隆任意声音!

Fish Speech:开源 TTS 的天花板,10 秒克隆任意声音 语音合成这件事,曾经是大厂的专属游乐场。现在,一个开源项目用 2700 万行代码和 1000 万小时音频数据,把这道门彻底踹开了。 一、它解决了什么问题? 长期…...

c++基础+类和对象

引用一旦被赋值,就不能再赋其他值??如下图返回返回值的引用意思是返回返回值本身在主函数中调用func函数,该函数返回a的引用(a的别名),出函数后a会被销毁,相当于返回野指针被引用的数…...

2026 SiteGround 官网人工在线客服聊天指南

由于Siteground 近年来为了降低人工压力,隐藏了直接的聊天入口。 不过即便没有登录账号,你依然可以通过“售前咨询(Sales Chat)”的方式找到人工客服。即使你是Siteground 老用户,你可能也并不知道本文提到的这些技巧。…...

高通 QCS8550 边缘智能实践:基于 Qwen2.5-7B 与 Agent+RAG 构建本地化知识助手

1. 高通QCS8550与边缘智能的黄金组合 第一次拿到高通QCS8550开发板时,我完全没想到这块巴掌大的板子能流畅运行70亿参数的大模型。作为高通面向边缘计算推出的旗舰级处理器,QCS8550采用4nm制程工艺,集成了Kryo CPU、Adreno GPU和Hexagon NPU三…...

StructBERT文本相似度模型在网络安全中的应用:恶意文本与钓鱼内容识别

StructBERT文本相似度模型在网络安全中的应用:恶意文本与钓鱼内容识别 最近和几个做安全的朋友聊天,他们都在抱怨一个事儿:现在的网络攻击越来越“聪明”了。钓鱼邮件写得跟真的一样,恶意脚本的注释伪装得人畜无害,社…...

基于计算机视觉的万物识别模型性能优化策略

基于计算机视觉的万物识别模型性能优化策略 你有没有遇到过这样的情况:好不容易部署了一个万物识别模型,结果在实际用的时候,发现识别速度慢得像蜗牛,或者经常把“猫”认成“狗”?别担心,这几乎是每个做计…...

ChatTTS下载安装全攻略:从原理到避坑指南

最近在折腾语音合成项目,发现ChatTTS这个开源工具挺有意思的,功能强大,效果也不错。但在下载安装过程中,确实遇到了不少“坑”,比如环境冲突、依赖版本不对、模型下载慢等等。今天就把我摸索出来的完整安装流程和一些避…...

5个免费IP查询API对比:哪个最适合你的项目?(附性能测试数据)

5个免费IP查询API深度评测:开发者选型指南与实战数据 在构建需要地理位置服务的应用时,IP查询API往往是开发者的首选方案。无论是电商平台的风控系统、内容分发网络的区域优化,还是简单的用户画像分析,一个稳定、精准且免费的IP查…...

《Kubernetes存储篇:基于nfs-subdir-external-provisioner 4.0.18工具自动创建持久化卷》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《K8S集群运维指南》 一、简介 1.1、工具简介 nfs-subdir-external-provisioner是一个用于 Kubernetes 的动态存储 Provisioner,它允许你使用已有的 NFS 服务器为集群中的 PVC(持久卷声明)提供动…...

Java+YOLO在医学影像的应用:CT肺结节检测的预处理与后处理优化

摘要:肺癌是全球癌症死亡的首要原因,早期筛查依赖于低剂量螺旋CT(LDCT)中微小结节的精准识别。然而,医学影像数据具有三维体素大、灰度动态范围极宽、背景干扰复杂等特点,直接套用通用2D YOLO模型效果不佳。…...

Java+YOLO在无人货架的应用:商品识别与库存同步的微服务实践

摘要:无人货架(Smart Shelf)作为“最后一公里”的零售终端,其核心难点在于低成本硬件下的高精度商品识别与实时库存同步。传统方案依赖昂贵的重力传感器或纯云端视觉分析,存在成本高、延迟大、弱网易失效等问题。本文提…...

C++数据结构1——可执行文件生成过程

C源代码生成最终可执行文件的过程&#xff0c;通常分为四个核心步骤&#xff1a;预处理(Preprocessing)、编译(Compilation)、汇编(Assembly) 和 链接(Linking)。我们可以通过一个经典的 HelloWorld 程序来完整演示这个过程&#xff1a;// hello.cpp #include <iostream>…...

Java高并发YOLO服务:100路摄像头实时交通标志识别与Redis缓存优化

摘要&#xff1a;在智慧交通系统中&#xff0c;面对成百上千路高清摄像头的实时视频流&#xff0c;传统的“单路单线程”或“Python脚本调用”架构早已不堪重负&#xff0c;导致延迟高企、资源浪费。本文深入探讨如何基于 Java 21 (Virtual Threads) 构建超高并发视频处理流水线…...

COMSOL模拟离子迁移及PH变化:电场、流场与稀物质传递三个物理场的应用

comsol模拟离子迁移PH变化。 应用到电场&#xff0c;流场&#xff0c;稀物质传递三个物理场。实验台上放着微流控芯片样品的时候&#xff0c;突然意识到酸碱度分布对实验结果影响比想象中更大。这时候COMSOL的多物理场耦合功能简直就是救星——把电场、流体、物质迁移三个模块组…...

基于麻雀算法优化门控循环单元的SSA-GRU单维时序预测模型——适用于MATLAB 2020及...

SSA-GRU单维时序预测预测&#xff0c;基于麻雀算法(SSA)优化门控循环单元(SSA-GRU)单维时间序列预测 1、运行环境要求MATLAB版本为2020及其以上&#xff0c;单输入单输出 2、评价指标包括:R2、MAE、MSE、RMSE等&#xff0c;图很多&#xff0c;符合您的需要 3、代码中文注释清晰…...

二维Comsol的Voronoi边界设置与多边形骨料、纤维骨料分析方法

二维comsol的Voronoi&#xff0c;可设置方形边界&#xff0c;圆形边界&#xff0c;椭圆边界等等。 可选择条带过渡界面厚度。 需要ABAQUS2020及以上版本&#xff0c;AUTOCAD2020及以上版本 以上两软件进行辅助生成。 另二维多边形骨料&#xff0c;纤维骨料等均可采用此方法。在…...

零成本养虾指南:OpenClaw从入门到卸载

一、基础环境 1、安装 nodejs 下载地址&#xff1a;https://nodejs.org/zh-cn/download/archive/v22.22.1演示版本&#xff1a;https://nodejs.org/dist/v22.22.1/node-v22.22.1-win-x64.zip 解压后&#xff0c;将路径(例如C:\myapp\node-v22.22.1-win-x64)添加到环境变量 …...

彻底搞懂STM32定时器:PSC、ARR、CNT详解,附精确延时代码---STM32 HAL库专栏

&#x1f3ac; 渡水无言&#xff1a;个人主页渡水无言 ❄专栏传送门&#xff1a; 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门&#xff1a; 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》 ❄专栏传送门&#xff1a;《产品测评专栏》…...

Windows操作系统核心知识与安全基础全解析

摘要&#xff1a;在数字世界的每一天&#xff0c;我们几乎都在与操作系统打交道&#xff0c;尤其是微软的Windows。它不仅是电脑的“大管家”&#xff0c;也是连接我们与硬件的桥梁。本文将带你从零开始&#xff0c;系统性地理解Windows的核心构成、运作方式以及至关重要的安全…...

Delta并联机器人:轨迹规划与工作空间求解的正逆解

Delta并联机器人轨迹规划工作空间求解正逆解今天咱们来聊聊Delta并联机器人的轨迹规划和工作空间求解&#xff0c;顺便撸点代码&#xff0c;看看怎么搞正逆解。先说说Delta机器人&#xff0c;这家伙在工业上用得挺多&#xff0c;尤其是高速抓取和装配的场景。它的结构简单&…...

SAP Joule:嵌入 SAP Fiori Launchpad 的生成式 AI 数字助手

在过去很多年里,企业用户对 数字助手 的期待一直很朴素:能回答问题、能帮我找入口、最好还能少点培训成本。可一旦系统规模进入 SAP S/4HANA、SuccessFactors、Ariba、SAP Build Work Zone 这类跨产品协同的现实世界,传统助手往往就会遇到天花板。它也许能理解一段对话,却未…...

刷题笔记:力扣第73、74题(二维矩阵)

力扣第73题-矩阵置零1.拿到题目后&#xff0c;第一时间想到应该先遍历一遍矩阵&#xff0c;分别使用一个行标记数组和一个列标记数组来标记哪里有0&#xff0c;然后进行置零操作&#xff0c;但题目要求使用原地算法&#xff0c;即不开辟新的数组、直接在原矩阵上进行操作。2.那…...

矩转换矩阵

格子玻尔兹曼方法&#xff08;LBM&#xff09;MRT作用力模型格子玻尔兹曼方法搞流动模拟的老司机都知道&#xff0c;MRT&#xff08;多松弛时间&#xff09;模型可比单松弛时间模型&#xff08;BGK&#xff09;香多了。这玩意儿最大的特点就是数值稳定性强&#xff0c;边界条件…...

SpringAI大语言模型调用优化:性能提升技巧

在前面的内容中&#xff0c;我们了解了SpringAI与大语言模型集成的相关基础信息。而在实际使用SpringAI调用大语言模型时&#xff0c;往往会遇到响应慢、资源消耗大等问题。这就需要我们掌握SpringAI调用大语言模型的性能优化方法&#xff0c;从而提升调用的性能。接下来&#…...

SpringAI集成OpenAI:从配置到调用实战

在当今的人工智能领域&#xff0c;大语言模型展现出了强大的能力。SpringAI作为一个优秀的框架&#xff0c;能够很好地与大语言模型集成&#xff0c;为开发者提供便捷的开发体验。而OpenAI作为大语言模型领域的佼佼者&#xff0c;其模型如GPT系列在自然语言处理等方面有着卓越的…...

用C语言程序解决两个简单问题

1.编写程序从键盘输入华氏温度&#xff0c;将其转化为摄氏温度后输出&#xff0c;要求保留2位小数。2. 从键盘输入一整型分钟数&#xff0c;将其换算成用小时和分钟表示&#xff0c;然后进行输出。...

SpringAI大语言模型应用案例:智能问答系统开发

在当今数字化时代&#xff0c;智能问答系统已经成为了许多企业和应用的核心功能之一。它能够快速、准确地回答用户的问题&#xff0c;提供高效的服务。而SpringAI与大语言模型的结合&#xff0c;为开发智能问答系统提供了强大的工具和方法。在这一小节中&#xff0c;我们将通过…...

ssm+java2026年毕设社区医院综合管理信息系统【源码+论文】

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容进度安排&#xff1a;2023年8月23日-2023年9月18日 与指导老师进行沟通&#xff0c;确认选题并提交题目进行审核2023年9月19日-2023年10月…...

MedGemma-X快速入门:无需代码,轻松实现X光片智能解读

MedGemma-X快速入门&#xff1a;无需代码&#xff0c;轻松实现X光片智能解读 1. 为什么选择MedGemma-X&#xff1f; 在医疗影像诊断领域&#xff0c;传统的人工阅片方式面临着效率低下、工作强度大、经验依赖性强等问题。而大多数AI辅助诊断工具又需要复杂的部署流程和技术背…...