【数据结构_10】二叉树(1)
一、树
树是一种非线性的数据结构,是由n个有限节点组成一个具有层次关系的集合。树的每个节点能够延伸出多个子节点,但每个子节点只能由一个父节点。
树形结构中,子树之间不能有交集,否则就不是树形结构。
二、树的表示形式
1.双亲表示法
class Node{
String val;
Node parent;
}//一般我们不使用这种表示方法,此时拿到根节点,无法知道所有的其他节点了
2.孩子表示法
class Node{
String val;
List<Node> children;
}//最常用的表示方法
3.孩子双亲表示法
class Node{
String val;
List<Node> children;
Node parent;
}
4.孩子兄弟表示法
class Node{
String val;
Node firstChild;
List<Node> brotherNodes;
}
三、二叉树
二叉树是一种树形结构,这棵树上面的所有节点,最多不能超过2个叉。也就是说,二叉树的任意节点的度,不能超过2。
以下这些树可以认为是二叉树。
两种特殊的二叉树:
1.满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。
2.完全二叉树:叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树
四、二叉树的性质
1.若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有
(i>0)个结点
2.若规定只有根结点的二叉树的深度为1,则深度为K的二叉树的最大结点数是
(k>=0)
3.对任何一棵二叉树,如果其叶结点个数为n0,度为2的非叶结点个数为n2,则有n0=n2+1
4.具有n个结点的完全二叉树的深度k为
上取整
5.对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i
的结点有:
若i>0,双亲序号:(i-1)/2;i=0,i为根结点编号,无双亲结点
若2i+1<n,左孩子序号:2i+1,否则无左孩子
若2i+2<n,右孩子序号:2i+2,否则无右孩子
五、二叉树的存储
树与二叉树的存储有着相同的原理:1.有一个专门的类,节点2.拿到根节点,后续的节点就能够一一拿到。
一般用孩子表示法来表示:
class Node{
String val;
Node left;//左子树
Node right;//右子树
}
如果某个节点只有左子树没有右子树,那么right == null;
树的核心操作—树的遍历
把一个集合中,所有的节点,按照一定的次序,全都访问一遍,访问过程中做到“不重不漏”。
*何为访问?访问是一个统称,表示针对这个数据进行的各种操作,例如,修改,判定,计算......
线性结构的遍历很简单,一个节点只有一个后续,但是二叉树是“非线性结构”,二叉树是有两个叉的。
二叉树拥有四种遍历方式:
区分他们的关键是约定好非线性结果的遍历顺序:
1.先序遍历
先序遍历:基于递归
①先访问当前节点的值
*此处以打印为例,就是打印当前节点的值(根节点)
②递归地针对左子树进行先序遍历
③递归地针对右子树进行先序遍历
*判定空,空树就直接返回
*核心操作有三个:(1)打印(2)左子树递归(3)右子树递归
代码段:
//先序遍历public static void preOrder(Node root){if(root == null){return;}System.out.print(root.val + " ");preOrder(root.left);preOrder(root.right);}
2.中序遍历
①先递归左子树
②访问根节点
③后递归右子树
代码段:
//中序遍历public static void inOrder(Node root){if(root == null){return;}inOrder(root.left);System.out.print(root.val+" ");inOrder(root.right);}
3.后序遍历
①先递归左子树
②后递归右子树
③访问根节点
代码段:
//后序遍历public static void postOrder(Node root){if(root == null){return ;}postOrder(root.left);postOrder(root.right);System.out.print(root.val+" ");}
*
这棵树原来的模样,
前序遍历的结果:A B D E G C F
中序遍历的结果:D B G E A C F
后序遍历的结果:D G E B F C A
*结论:
①对于先序遍历来说,第一个元素就是根节点
对于后序来说,最后一个元素就是根节点
②站在子树的角度
先序遍历中的子树部分,第一个元素,也就是子树的根节点
后序遍历的字数部分,最后一个元素,也就是子树的根节点
③对于中序遍历来说,遍历结果中,根节点左侧的元素就是属于左子树,右侧的元素就是属于右子树
进一步的针对子树的中序遍历部分,子树的根节点在中间,左侧部分是子树的左子树中序遍历结果,右侧部分是子树的右子树的中序遍历结果
4.层序遍历
层序遍历就是按照层位维度,把每一层的元素从左到右地访问出来
层序遍历的实现,需要搭配一个“队列”
①创建队列,队列元素就是Node,先把根节点入队列
②循环地取出队首元素,访问这个元素的值
③把这个元素的左子树和右子树都分别入队列(非空)
④回到②,循环操作
⑤如果队列为空,说明遍历就结束了
//层序遍历public static void levelOrder(Node root){if(root == null){return;}//创建一个队列Queue<Node> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){Node cur = queue.poll();System.out.print(cur.val+" ");if(cur.left != null){queue.offer(cur.left);}if(cur.right != null){queue.offer(cur.right);}}}
输出:A B C D E F G
*关于完全二叉树
严格地表述完全二叉树的规则:
针对这个二叉树进行层序遍历,遍历过程分成两个阶段:
1.第一阶段中,任何一个访问到的节点,都应该有两个子树:
如果遇到了这样的情况
a)如果遇到了没有子树的节点,进入二阶段
b)如果遇到了只有左子树的节点,也进入二阶段
c)如果遇到了只有右子树的节点,直接认为不是完全二叉树
2.第二阶段中,要求每个节点都必须是没有子树 一旦遇到了有子树的节点,就不是完全二叉树
完全二叉树非常特殊,有更好更方便的表示方式,而不能通过孩子表示法来表示,一旦切换表示方式,完全二叉树的判断就非常简单(在堆的章节中进行详细地讨论)
给定二叉树的遍历结果,把这个树还原出来:
如果只给先序,是否可以把二叉树给还原出来呢?结果是否定的。e.g.
如果只给中序,是否可以把二叉树给还原出来呢?结果也是否定的。e.g.
如果只给后序,是否可以把二叉树给还原出来呢?结果也是否定的。e.g.
至少要给两个序列才可以,而且两个序列中,必须要包含中序的结果。
也就是说,可以通过线序+中序来还原二叉树,也可以通过后序+中序还原二叉树,但是先序+后序是没办法还原二叉树的!e.g.
相关文章:
【数据结构_10】二叉树(1)
一、树 树是一种非线性的数据结构,是由n个有限节点组成一个具有层次关系的集合。树的每个节点能够延伸出多个子节点,但每个子节点只能由一个父节点。 树形结构中,子树之间不能有交集,否则就不是树形结构。 二、树的表示形式 1…...
c++:智能指针
1.智能指针使用场景与优势 void Func() { int* array1 new int[10]; int* array2 new int[10]; try { int len, time; cin >> len >> time; cout << Divide(len, time) << endl; } catch (...) { cout << "delete []" << arr…...
RISC-V简介
RISC-V简介 1. RISC-V RISC-V(发音为“riskfive”)是一个基于精简指令集(RISC)原则的全新开源指令集架构(ISA)。其中的字母“V”包含两层意思,一是这是Berkeley从RISCI开始设计的第五代指令集…...
Google Test 与 Google Mock:C++ 测试与模拟的完美结合
Google Test 与 Google Mock:C 测试与模拟的完美结合 摘要 本文深入解析 Google Test(GTest)和 Google Mock(GMock)的核心功能与使用方法,探讨两者在 C 项目中的联合应用及集成策略。通过详细的功能介绍、…...
c语言数据结构----------二叉排序树
#include <stdio.h> #include <malloc.h>//定义二叉排序树 typedef struct BSTnode {int key; //节点值int keyNull; //便于地址传递struct BSTnode *lchild;struct BSTnode *rchild; } BSTnode;//往二叉排序树插入结点 int BSTInsert(BSTnode *T, int k) {if (…...
Sysstat学习
Sysstat(System Statistics)是一个功能强大的开源工具集,用于监控 Linux 系统的性能和资源使用情况,特别适用于 Ubuntu 系统。它包含多个工具,如 sar、iostat、mpstat 和 pidstat,帮助系统管理员实时或历史…...
智能体开发范式革命:Cangjie Magic的颠覆性创新与行业重塑
开篇:一场静悄悄的技术革命 2025年春季,人工智能领域发生了一场意义深远却鲜为人知的变革。仓颉社区推出的Cangjie Magic智能体开发平台,正以润物细无声的方式重塑着AI应用的构建范式。这并非简单的工具迭代,而是一次从底层逻辑到顶层设计的全面革新。本文将带领读者深入探…...
k8s 下 java 服务出现 OOM 后获取 dump 文件
文章目录 背景解决第 1 步:通过 Dockerfile 挂载 NFS 盘第 2 步:修改 dump 路径为 NFS 盘路径第 3 步:OOM dump 验证参考背景 😂 背景:项目部署在RainBond(k8s)环境下,容器出现 OOM 异常后,k8s 会自动进行滚动更新。 恰恰因为滚动更新,会导致原来的容器被删除。这…...
16位海明码解码电路设计教程
## 1. 海明码基本原理 ### 1.1 什么是海明码 海明码(Hamming Code)是一种能够检测并纠正单比特错误的纠错码,由理查德海明(Richard Hamming)于1950年发明。它通过添加几个校验位(奇偶校验位)到原始数据中,使得数据在传输过程中发生单比特错误时能够被检测…...
九、数据库day01--认识
文章目录 一、认识数据库1.数据库分类关系型数据库核⼼要素示例 2. SQL 语⾔3. MySQL 数据库介绍4. 数据库连接⼯具 Navicat连接数据库操作步骤 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、认识数据库 说明: 数据库是专⻔⽤来存储数据的软…...
2.深入剖析 Rust+Axum 类型安全路由系统
摘要 详细解读 RustAxum 路由系统的关键设计原理,涵盖基于 Rust 类型系统的路由匹配机制、动态路径参数与正则表达式验证以及嵌套路由与模块化组织等多种特性。 一、引言 在现代 Web 开发中,路由系统是构建 Web 应用的核心组件之一,它负责…...
深度学习 从入门到精通 day_02
1. 自动微分 自动微分模块torch.autograd负责自动计算张量操作的梯度,具有自动求导功能。自动微分模块是构成神经网络训练的必要模块,可以实现网络权重参数的更新,使得反向传播算法的实现变得简单而高效。 1.1 基础概念 1. 张量 :…...
Selenium 实现自动化分页处理与信息提取
Selenium 实现自动化分页处理与信息提取 在 Web 自动化测试或数据抓取场景中,分页处理是一个常见的需求。通过 Selenium,我们可以实现对多页面内容的自动遍历,并从中提取所需的信息。本文将详细介绍如何利用 Selenium 进行自动化分页处理和信…...
【系统搭建】DPDK实现两虚拟机基于testpmd和l2fwd的收发包
testpmd与l2fwd的配合构建一个高性能的虚拟网络测试环境。l2fwd服务工作在数据链路层,使用MAC地址寻址,很多基于DPDK的策略实现可以基于l2fwd进行开发。 一、拓扑结构示意 ------------------- 虚拟化层网络 ------------------- | 虚拟机1 …...
简单接口工具(ApiCraft-Web)
ApiCraft-Web 项目介绍 ApiCraft-Web 是一个轻量级的 API 测试工具,提供了简洁直观的界面,帮助开发者快速测试和调试 HTTP 接口。 功能特点 支持多种 HTTP 请求方法(GET、POST、PUT、DELETE)可配置请求参数(Query …...
C语言数据类型取值范围
32位C语言整型数据类型取值范围 64位C语言整型数据类型取值范围 C语言标准数据类型保证的取值范围 在编写程序时如果要方便移植,我们应该关注的是图2-11的取值范围。 摘录自《CSAPP》。...
【机器学习】大数据时代,模型训练慢如牛?解锁Spark MLlib与分布式策略
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
合成数据赋能AI:从生成到闭环的全景图谱
目录 合成数据赋能AI:从生成到闭环的全景图谱 🎯 项目目标 📄 白皮书 / PPT 大纲结构 一、合成数据概述(What & Why) 二、合成数据的核心生成技术(How) 三、合成数据适配任务…...
CS144 Lab0实战记录:搭建网络编程基础
文章目录 1 实验概述与背景2 ByteStream的设计与实现2.1 字节流抽象概述2.2 实现思路2.3 核心数据结构2.4 Writer实现细节2.5 Reader实现细节 3 WebGet应用实现 1 实验概述与背景 Stanford大学的CS144课程是计算机网络领域最著名的课程之一,其实验设计巧妙地引导学…...
杂记-LeetCode中部分题思路详解与笔记-HOT100篇-其三
时光荏苒啊,没想到这么快就到了四月份... 这个坑好久没写了,现在我们重启一下。 我看了一下之前的笔记,似乎是停留在了链表部分且HOT100中可以说最重要的链表题之一:LRU缓存居然没有写,真是岂有此理,让我…...
【python画图】:从入门到精通绘制完美柱状图
目录 Python数据可视化:从入门到精通绘制完美柱状图一、基础篇:快速绘制柱状图1.1 使用Matplotlib基础绘制1.2 使用Pandas快速绘图 二、进阶篇:专业级柱状图定制2.1 多系列柱状图2.2 堆叠柱状图2.3 水平柱状图 三、专业参数速查表Matplotlib …...
医疗设备预测性维护的合规性挑战与标准化路径研究
摘要 本研究从医疗设备全生命周期管理视角,探讨预测性维护技术面临的特殊合规性挑战及其标准化解决方案。通过分析全球12个主要医疗市场的监管差异,提出基于ISO 23510的通用合规框架,并验证其在三类典型医疗设备(生命支持类、影像…...
使用 XWPFDocument 生成表格时固定列宽度
一、XWPFDocument XWPFTable个性化属性 1.初始默认写法 XWPFTable table document.createTable(n, m); //在文档中创建一个n行m列的表格 table.setWidth("100%"); // 表格占页面100%宽度// 通过getRow获取行进行自定义设置 XWPFTableRow row table.getRow(0); XW…...
抽象的https原理简介
前言 小明和小美是一对好朋友,他们分隔两地,平时经常写信沟通,但是偶然被小明发现他回给小美的信好像被人拆开看过,甚至偷偷被篡改过。 对称加密算法 开头的通信过程比较像HTTP服务器与客户端的通信过程,全明文传输…...
Chakra UI框架中响应式断点
默认的断点:base是默认样式,不带任何媒体查询,适用于所有屏幕。 sm是30em(约480px) md是48em(768px) lg是62em(992px) xl是80em(1280px) 2xl是96e…...
【cocos creator 3.x】cocos creator2.x项目升级3.x项目改动点
1、基本改动 基本改动:去掉了cc.,改成在顶部添加导入 项目升级时候直接将cc.去掉,根据提示添加引用 node只保留position,scale,rotation,layer 其余属性如opacity,如果需要使用需要在节点手动添加UIOpacity组件 3d层和ui层分开…...
【android telecom 框架分析 01】【基本介绍 2】【BluetoothPhoneService为何没有源码实现】
1. 背景 我们会在很多资料上看到 BluetoothPhoneService 类,但是我们在实际 aosp 中确找不到具体的实现, 这是为何? 这是一个很好的问题!虽然在车载蓝牙电话场景中我们经常提到类似 BluetoothPhoneService 的概念,但…...
Linux:进程:进程调度
进程在CPU上运行具有以下特性: 竞争、独⽴、并⾏、并发 竞争性:系统进程数⽬众多,⽽CPU资源很少甚至只有一个,所以进程之间是具有竞争属性的。为 了⾼效完成任务,更合理竞争相关资源,便具有了优先级 独⽴性: 为了避…...
2025年探秘特种设备安全管理 A 证:守护安全的关键凭证
在现代工业与生活中,特种设备如锅炉、压力容器、电梯、起重机械等广泛应用,它们给我们带来便利的同时,也伴随着较高的安全风险。为了确保这些设备的安全运行,保障人民生命财产安全,特种设备安全管理显得尤为重要&#…...
WebSocket 实现数据实时推送原理
WebSocket 实现数据实时推送的核心机制在于其全双工通信能力和持久的连接特性。以下是其工作原理的详细步骤: 1. 握手阶段(HTTP 升级协议) 客户端发起请求:通过发送一个带有特殊头部的 HTTP 请求,请求协议升级。 GET …...
快速迭代收缩-阈值算法(FISTA)
文章目录 1. 数学与优化基础2. FISTA 算法的原理、推导与机制3. Matlab 实现4. FISTA 在图像处理与压缩感知中的应用4.1. 基于小波稀疏先验的图像去噪4.2 压缩感知图像重建 1. 数学与优化基础 在许多信号处理与机器学习问题中,我们希望获得稀疏解,即解向…...
XC6SLX100T-2FGG484I 赛灵思 XilinxFPGA Spartan-6
XC6SLX100T-2FGG484I 是Xilinx 推出的Spartan-6 LXT 系列FPGA芯片,采用45nm工艺设计,以高性价比和低功耗为核心 系列定位:Spartan‑6 LXT,中端逻辑与 DSP 加速 逻辑资源:101 261 个逻辑单元(LE࿰…...
DP 32bit位宽数据扰码实现和仿真
关于DisplayPort 1.4协议中扰码用的16-bit LFSR的移位8个时钟周期后的输出表达式我们已经用迭代的方法推导过,那么移位32个时钟周期的输出表达式同样可以迭代32次推导出,或者将移位8个时钟的输出表达式迭代3次也可以得到。以下就是移位32个时钟周期的输出…...
Electricity Market Optimization 探索系列(V)
本文参考链接link \hspace{1.6em} 众所周知, 社会福利是指消费者剩余和生产者剩余的和,也等价于产品的市值减去产品的成本,在电力市场中也非常关注社会福利这一概念,基于电力商品的同质性的特点,我们引入反价格需求函数来形象地刻…...
vue3 element-plus el-time-picker控制只显示时 分,并且控制可选的开始结束时间
只显示时分 控制只显示时分 HH:mm 控制只显示时分秒 HH:mm:ss 全部代码: <template><el-time-pickerstyle"width: 220px !important;"v-model"timeValue"format"HH:mm"value-format"HH:mm"/> </template&…...
从技术本质到未来演进:全方位解读Web的过去、现在与未来
一、Web的本质定义 Web(万维网)是一种基于**超文本传输协议(HTTP)和统一资源标识符(URI)**构建的分布式信息系统。它的核心在于通过超链接将全球范围内的信息资源连接成网状结构,使任何接入互联网的设备都能访问这些资源。Web的本质特征体现在三个方面: 跨平台性:无论…...
C++十进制与十六进制
在C中,可以使用不同的方式来表示十进制和十六进制数值。下面是一个简单的示例代码,展示了如何在C中表示和输出十进制和十六进制数值: #include <iostream> #include <iomanip>int main() {int decimalValue 255; // 十进制数值…...
MySQL基本语法
本地登录:mysql -u 用户名 -p 查看数据库:show databeases 创建库:create database 名字; 删除库:drop database 名字; 选择库:use 名字; 创建表:create table 表名 在…...
机器学习有多少种算法?当下入门需要全部学习吗?
机器学习算法如同工具箱中的器械——种类繁多却各有专攻。面对数百种公开算法,新手常陷入"学不完"的焦虑。本文将拆解算法体系,为初学者指明高效学习路径。 一、算法森林的全景地图 机器学习算法可按四大维度分类: 监督学习&#…...
【c语言】深入理解指针2
文章目录 一、指针数组指针数组模拟二维数组 二、数组指针二维数组传参的本质 三、字符指针变量四、函数指针变量4.1. 函数指针的应用4.2 两端有趣的代码4.3. typedef关键字4.3.1 typedef 的使用4.3.2. typedef与#define对比 五、函数指针数组函数指针数组的应用 一、指针数组 …...
Nacos
Nacos是阿里巴巴的产品, 现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。 官网地址:Redirecting to: https://nacos.io/ GitHub: https://github.com/alibaba/nacos 1.Nacos快入门 Nacos可以直…...
Linux,redis群集模式,主从复制,读写分离
redis的群集模式 主从模式 (单项复制,主复制到从) 一主两从 一台主机上的一主两从 需要修改三个配置文件 主要端口不一样 redis-8001.conf redis-8002.conf redis-8003.conf 哨兵模式 分布式集群模式 redis 安装部署 1,下载…...
《手环表带保养全攻略:材质、清洁与化学品避坑指南》
系列文章目录 文章目录 系列文章目录前言一、表带材质特性与专属养护方案二、清洁剂使用红黑榜三、家庭清洁实验:化学反应警示录四、保养实践方法论总结 前言 手环作为现代生活的智能伴侣,表带材质选择丰富多样。从柔软亲肤的皮质到耐用耐磨的金属&…...
【Leetcode 每日一题 - 补卡】1534. 统计好三元组
问题背景 给你一个整数数组 a r r arr arr,以及 a 、 b 、 c a、b 、c a、b、c 三个整数。请你统计其中好三元组的数量。 如果三元组 ( a r r [ i ] , a r r [ j ] , a r r [ k ] ) (arr[i], arr[j], arr[k]) (arr[i],arr[j],arr[k]) 满足下列全部条件ÿ…...
医疗设备预测性维护合规架构:从法规遵循到技术实现的深度解析
在医疗行业数字化转型加速推进的当下,医疗设备预测性维护已成为提升设备可用性、保障医疗安全的核心技术。然而,该技术的有效落地必须建立在严格的合规框架之上。医疗设备直接关乎患者生命健康,其维护过程涉及医疗法规、数据安全、质量管控等…...
如何在 IntelliJ IDEA 中安装 FindBugs-IDEA 1.0.1
以下是 FindBugs-IDEA 1.0.1 插件在 IntelliJ IDEA 中的安装步骤(适用于较旧版本的 IDEA,新版本可能需使用替代插件如 SpotBugs): 方法一:手动下载安装(适用于无法通过市场安装的情况) 下载插件…...
小车正常但是加载不出地图 找不到mapserver
Request for map failed; trying again... 找不到mapserver 原因: bash [ERROR] [1744895448.714854952]: failed to open image file "/home/liyb/catkin_ws/src/nav_demo/map/crossing.pgm": Couldnt open /home/xxx/catkin_ws/src/nav_demo/map/cr…...
无头开发模式
“无头”开发模式(Headless Development Mode)是指在没有直接连接物理显示器(monitor)、键盘或鼠标等输入输出设备的情况下,通过远程工具(如 SSH、SCP、rsync、VNC 或 Web 界面)对设备进行开发、…...
DAY 47 leetcode 232--栈与队列.用栈实现队列
题号232 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;/** Initialize your data structure here. */pu…...
SpringAI+DeepSeek大模型应用开发——4 对话机器人
目录 项目初始化 pom文件 配置模型 ChatClient 同步调用 流式调用 日志功能 对接前端 解决跨域 会话记忆功能 ChatMemory 添加会话记忆功能 会话历史 管理会话id 保存会话id 查询会话历史 完善会话记忆 定义可序列…...