每日学习一个数据结构-树
文章目录
- 树的相关概念
- 一、树的定义
- 二、树的基本术语
- 三、树的分类
- 四、特殊类型的树
- 五、树的遍历
- 六、树的应用场景
- 树的遍历
- 一、前序遍历
- 二、中序遍历
- 三、后序遍历
- 使用java代码实现遍历
- 总结
树的相关概念
树是一种重要的非线性数据结构,在计算机科学中有着广泛的应用。以下是对树的相关概念的详细说明:
一、树的定义
树是由n(n≥0)个节点组成的有限集合。当n=0时,称为空树;当n>0时,为非空树。在非空树中,有且仅有一个特定的节点被称为根(root),其余节点可分为m(m>0)个互不相交的有限集T1, T2, …, Tm,其中每一个集合本身又是一棵树,并且被称为根的子树(Subtree)。
二、树的基本术语
- 节点(Node):包含一个数据元素及若干指向其子树的分支。
- 结点的度(Degree of a Node):一个节点拥有的子树数目。
- 树的度(Degree of a Tree):树中所有节点度的最大值。
- 叶子节点(Leaf Node):度为零的节点,也称为终端节点。
- 分支节点(Branch Node):度大于零的节点,也称为非终端节点。
- 路径(Path):由从根节点到某一节点所经分支和节点构成的序列。
- 路径的长度:是路径上所经过的边的个数。
- 节点的层次(Level of a Node):从根节点到该节点所经过的路径长度加1。根节点位于第1层。
- 树的深度(Depth of a Tree):树中叶子节点具有的最大层次数。
- 树的宽度(Width of a Tree):整棵树中某一层中最多的节点数。
三、树的分类
- 有序树(Ordered Tree):如果将树中节点的各子树看成从左至右是有次序的(即不能互换),则称该树为有序树。与之相对的是无序树,其中子树的顺序不重要。
- 二叉树(Binary Tree):每个节点最多有两个子树的树结构。二叉树具有一些特殊的性质,如满二叉树、完全二叉树等。
- m叉树:每个节点最多有m个子树的树结构。
四、特殊类型的树
- 满二叉树:除最后一层外,每一层上的所有节点都有两个子节点,且最后一层上的节点都靠左对齐的树。
- 完全二叉树:一棵二叉树,除最后一层外,每一层上的节点数均达到最大值,并且最后一层上的节点都靠左对齐的树。
- 平衡二叉树(AVL树):一种特殊的二叉查找树,它的任意节点的左右子树的高度差的绝对值不超过1。
- 红黑树(Red-Black Tree):一种自平衡的二叉查找树,它的节点是红色或黑色的,并且满足一系列额外的性质来保持树的平衡。
五、树的遍历
树的遍历是指按照某种规则访问树中的所有节点,使得每个节点被访问且仅被访问一次。常见的遍历方法包括前序遍历、中序遍历和后序遍历等。
六、树的应用场景
- 文件系统:使用树形结构来组织和管理文件和目录。
- 域名解析系统:采用层次式树形结构来组织和管理域名。
- 编译器:使用树形结构(如语法树)来表示源代码的结构和语义。
- 决策树:一种常用的机器学习算法,使用树形结构来表示决策过程。
综上所述,树是一种重要的数据结构,具有广泛的应用场景和丰富的性质。了解树的基本概念、分类、特殊类型、遍历方法和应用场景,有助于更好地理解和应用树这种数据结构。
树的遍历
树的遍历是树这种数据结构的基本操作之一,它指的是按照某种规则访问树中的所有节点,并且每个节点仅访问一次。树的遍历主要有三种方式:前序遍历(也称为先序遍历)、中序遍历、后序遍历(也称为后续遍历)。以下是这三种遍历方式的详细描述:

一、前序遍历
- 遍历顺序:先访问根节点,然后遍历左子树,最后遍历右子树。
- 特点:在第一次遍历到节点时就执行操作。一般只是想遍历执行操作(或输出结果)可选用前序遍历。
- 递归实现:对于当前节点,首先访问该节点,然后递归地对左子树进行前序遍历,最后递归地对右子树进行前序遍历。
- 示例:假设有一棵树,根节点为A,左子节点为B,右子节点为C,B的左子节点为D,右子节点为E,C的右子节点为F。那么前序遍历的顺序为A→B→D→E→C→F。
二、中序遍历
- 遍历顺序:先遍历左子树,然后访问根节点,最后遍历右子树。
- 特点:对于二分搜索树(BST),中序遍历的操作顺序(或输出结果顺序)是符合从小到大(或从大到小,取决于BST的排序规则)顺序的。故要遍历输出排序好的结果需要使用中序遍历。
- 递归实现:对于当前节点,首先递归地对左子树进行中序遍历,然后访问该节点,最后递归地对右子树进行中序遍历。
- 示例:继续以上述树为例,中序遍历的顺序为D→B→E→A→C→F。
三、后序遍历
- 遍历顺序:先遍历左子树,然后遍历右子树,最后访问根节点。
- 特点:执行操作时,肯定已经遍历过该节点的左右子节点。故适用于要进行破坏性操作的情况,比如删除所有节点。
- 递归实现:对于当前节点,首先递归地对左子树进行后序遍历,然后递归地对右子树进行后序遍历,最后访问该节点。
- 示例:继续以上述树为例,后序遍历的顺序为D→E→B→F→C→A。
使用java代码实现遍历
在Java中,我们可以通过递归或迭代的方式来实现树的三种遍历方式:前序遍历、中序遍历和后序遍历。以下是一个简单的基于二叉树的实现示例:
首先,我们定义一个二叉树节点的类:
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}
接下来,我们分别实现前序遍历、中序遍历和后序遍历的递归方法:
public class BinaryTreeTraversal {// 前序遍历public void preorderTraversal(TreeNode root) {if (root == null) {return;}System.out.print(root.val + " "); // 访问根节点preorderTraversal(root.left); // 遍历左子树preorderTraversal(root.right); // 遍历右子树}// 中序遍历public void inorderTraversal(TreeNode root) {if (root == null) {return;}inorderTraversal(root.left); // 遍历左子树System.out.print(root.val + " "); // 访问根节点inorderTraversal(root.right); // 遍历右子树}// 后序遍历public void postorderTraversal(TreeNode root) {if (root == null) {return;}postorderTraversal(root.left); // 遍历左子树postorderTraversal(root.right); // 遍历右子树System.out.print(root.val + " "); // 访问根节点}public static void main(String[] args) {// 创建一个简单的二叉树// 1// / \// 2 3// / \// 4 5TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);BinaryTreeTraversal traversal = new BinaryTreeTraversal();System.out.print("前序遍历: ");traversal.preorderTraversal(root);System.out.println();System.out.print("中序遍历: ");traversal.inorderTraversal(root);System.out.println();System.out.print("后序遍历: ");traversal.postorderTraversal(root);System.out.println();}
}
在这个示例中,我们创建了一个简单的二叉树,并分别调用了前序遍历、中序遍历和后序遍历的方法。每种遍历方法都会按照相应的顺序打印出节点的值。
请注意,这个示例使用了递归的方法来实现遍历。对于大型树结构,递归可能会导致栈溢出。在这种情况下,你可以考虑使用迭代的方法(例如使用栈或队列)来实现遍历。不过,对于大多数常见的应用场景,递归方法已经足够高效和易于理解。
总结
- 访问时机:三种遍历方式的主要区别在于访问根节点的时机不同。在前序遍历中,根节点在左、右子节点之前被访问;在中序遍历中,根节点在左、右子节点之间被访问;在后序遍历中,根节点在左、右子节点之后被访问。
- 应用场景:根据具体问题的需求选择合适的遍历方式。例如,如果只是想遍历执行操作(或输出结果),可以选择前序遍历;如果需要得到排序好的输出结果(特别是在二分搜索树中),可以选择中序遍历;如果需要进行破坏性操作(如删除节点),可以选择后序遍历。
在实际应用中,还可以根据具体需求对遍历方式进行适当的修改或扩展。
相关文章:
每日学习一个数据结构-树
文章目录 树的相关概念一、树的定义二、树的基本术语三、树的分类四、特殊类型的树五、树的遍历六、树的应用场景 树的遍历一、前序遍历二、中序遍历三、后序遍历使用java代码实现遍历总结 树的相关概念 树是一种重要的非线性数据结构,在计算机科学中有着广泛的应用…...
简单PCL库读文件(linux vscode编译)
#include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/common.h> #include <iostream>int main(int argc, char** argv) {if (argc ! 2) {std::cerr << "请指定 PCD 文件路径" << std::endl;return -…...
【自动驾驶】最近计划看的论文
将对应的论文链接贴出来,当作监督自己。 方向:端到端自动驾驶 方法论文代码UniADhttps://arxiv.org/pdf/2212.10156https://github.com/OpenDriveLab/UniADVADhttps://arxiv.org/pdf/2303.12077https://github.com/hustvl/VADUADhttps://arxiv.org/pdf…...
vue3学习:axios输入城市名称查询该城市天气
说来惭愧,接触前端也有很长一段时间了,最近才学习axios与后端的交互。今天学习了一个查询城市天气的案例,只需输入城市名称,点击“查询”按钮便可以进行查询。运行效果如下: 案例只实现了基本的查询功能,没…...
影刀RPA实战:Excel拆分与合并工作表
1.影刀操作excel的优势 Excel,大家都不陌生,它是微软公司推出的一款电子表格软件,它是 Microsoft Office 套件的一部分。Excel 以其强大的数据处理、分析和可视化功能而闻名,广泛应用于商业、教育、科研等领域。可以说࿰…...
STM32三种启动模式:【详细讲解】
STM32在上电后,从那里启动是由BOOT0和BOOT1引脚的电平决定的,如下表: BOOT模式选引脚启动模式BOOT0BOOT1X0主Flash启动01系统存储器启动11内置SRAM启动 BOOT 引脚的值在重置后 SYSCLK 的第四个上升沿时被锁定。在重置后,由用户决定是如何设…...
Ray_Tracing_The_Next_Week
1动态模糊 动态模糊在摄影中就是快门的速度慢,捕捉光的时间长,物体运动时进行捕捉成像,拍出来的结果是这个运动过程每一帧的平均值 我们的思路是: 每一条光线都拥有自己存在的一个时间点。随着时间变化随机生成光线,一般来说我…...
DBT hook 实战教程
本文将介绍dbt中在模型和seed级别使用post-hook的几个具体示例。dbt中的Post-hooks是一个强大而简单的特性,它在构建模型之后(如果是pre-hook,甚至在此之前)执行SQL语句。这些语句实际上(几乎)可以是任何东西,从将表复制到另一个数据库/模式&…...
SpringBoot整合JPA详解
SpringBoot版本是2.0以上(2.6.13) JDK是1.8 一、依赖 <dependencies><!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><!--…...
【微服务】springboot 实现动态修改接口返回值
目录 一、前言 二、动态修改接口返回结果实现方案总结 2.1 使用反射动态修改返回结果参数 2.1.1 认识反射 2.1.2 反射的作用 2.1.3 反射相关的类 2.1.4 反射实现接口参数动态修改实现思路 2.2 使用ControllerAdvice 注解动态修改返回结果参数 2.2.1 注解…...
【前端开发入门】html快速入门
目录 引言一、html基础模板内容二、html文档流三、html 标签1.块级元素2.行内元素3.功能性元素4.标签嵌套 四、html编码习惯五、总结 引言 本系列教程旨在帮助一些零基础的玩家快速上手前端开发。基于我自学的经验会删减部分使用频率不高的内容,并不代表这部分内容不…...
python配置环境变量
方法一:首先卸载重新安装,在安装时勾选增加环境变量 方法二:我的电脑-属性-高级系统配置 手动添加环境变量,路径为python的安装路径 检查:查看环境变量是否安装成功 安装第三方lib winr,输入cmd pip ins…...
从0到1:培训机构排课小程序开发笔记一
业务调研 随着人们生活水平的提高,健康意识和学习需求日益增强,私教、健身和培训机构的市场需求迅速增长。高效的排课系统不仅可以提升机构的管理效率,还能提高学员的满意度。解决传统的排课方式存在的时间冲突、信息不对称、人工操作繁琐等…...
方法重载(Overload)
前言 在前面的学习中,我们学到了重写(Override),这里我们主要进行重载(Overload)的介绍,同时对重写和重载的区别进行分析。 1. 重载(Overload) #方法重载 在同一个类中定义多个同名但参数不同的方法。我们称方法与方法之间构成方法重载 在Java中&…...
[论文笔记]SGPT: GPT Sentence Embeddings for Semantic Search
引言 解码器Transformer的规模不断壮大,轻松达到千亿级参数。同时由于该规模,基于提示或微调在各种NLP任务上达到SOTA结果。但目前为止解码器Transformer还无法应用在语义搜索或语句嵌入上。 为了简单,下文中以翻译的口吻记录,比…...
基于微信小程序的旅游拼团系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
富格林:警悟可信经验安全投资
富格林指出,黄金具有不错的投资价值,一直以来备受投资者的喜爱,近年来大家也纷纷加入现货黄金市场为己增值财富。但是要为投资安全护航的前提,是需要投资者使用合适可信的方法以及掌握相对应的投资技巧。下面富格林将总结以下可信…...
【Linux】使Ubuntu自适应窗口大小并与主机共享文件
LInux虚拟机版本ubuntu-20.04.6,VM版本VMware Workstation 17 Pro VMware Tools™ 是一组服务和模块,是VMware公司在其虚拟化平台中提供的一套工具集,旨在提高虚拟机的性能和稳定性。它们支持 VMware 产品中的多种功能特性,有助于…...
C++ 语言特性18 - static_assert 介绍
一:概述 在 C 中,static_assert 是一种用于在编译时进行断言的机制,确保某些编译时条件成立。如果条件不成立,则编译器会生成错误,阻止代码的编译。static_assert 在 C11 中引入,目的是帮助程序员在编译时捕…...
centos 7.9系统redis6.2.6哨兵模式部署
由于系统需要处理大量的数据并发请求,所以借助于Redis的高性能,可以有效提升整个系统的处理效率。这里采用redis6.2版本源码编译部署哨兵模式,提高整个系统的可用性,避免单点故障。 1. Redis基本环境安装 centos7安装redis 6.2.6 采用源码编译方式安装。 服务器主机名:…...
终极OpenHTMLtoPDF教程:5分钟构建专业PDF生成器
终极OpenHTMLtoPDF教程:5分钟构建专业PDF生成器 【免费下载链接】openhtmltopdf An HTML to PDF library for the JVM. Based on Flying Saucer and Apache PDF-BOX 2. With SVG image support. Now also with accessible PDF support (WCAG, Section 508, PDF/UA)!…...
ComfyUI-Impact-Pack V8:AI图像增强的模块化革命与智能内存管理
ComfyUI-Impact-Pack V8:AI图像增强的模块化革命与智能内存管理 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址:…...
从绿光到深紫外:手把手教你选对BBO、LBO、CLBO晶体,搞定激光倍频实验
从绿光到深紫外:非线性晶体选型与倍频实验实战指南 当实验室的1064nm激光器发出那束熟悉的近红外光时,许多研究者脑海中会立刻浮现两个问题:如何高效获得532nm的翠绿光束?又该如何进一步压缩波长至266nm的深紫外区域?…...
如何构建专业级电子签名:现代前端解决方案指南
如何构建专业级电子签名:现代前端解决方案指南 【免费下载链接】smooth-signature H5带笔锋手写签名,支持PC端和移动端,任何前端框架均可使用 项目地址: https://gitcode.com/gh_mirrors/smo/smooth-signature 在数字化办公时代&#…...
mpv.net 高效配置实战:从媒体播放到专业调优的进阶指南
mpv.net 高效配置实战:从媒体播放到专业调优的进阶指南 【免费下载链接】mpv.net 🎞 mpv.net is a media player for Windows with a modern GUI. 项目地址: https://gitcode.com/gh_mirrors/mp/mpv.net 作为一款基于mpv核心的现代化Windows媒体播…...
CANN/asc-devkit数据依赖配置API
ValueDepend 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.co…...
如何免费突破网盘限速?8大平台直链下载终极指南
如何免费突破网盘限速?8大平台直链下载终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 /…...
RK3588+ZYNQ+ROS2 机器人 “强实时控制 + AI 感知 + 边缘计算” 三位一体核心控制器
一、方案总览:为什么是 RK3588ZYNQ7045(国产替代用复旦微 FMQL45T900)RK3588(8nm,瑞芯微):主 AI 业务中枢,6TOPS NPU、8 核 CPU(4A764A55)、8K 编解码、丰富…...
别再死记硬背了!用‘榨汁机’和‘张三的饭量’搞定高数函数定义域(附3类题型解法)
用生活化思维破解高数函数定义域:从榨汁机到张三的饭量 第一次翻开高等数学教材时,那些密密麻麻的函数符号让我头晕目眩。直到有一天,我在厨房榨果汁时突然顿悟——原来函数就像一台榨汁机,而定义域不过是张三在不同状态下的饭量。…...
拓璞数控港股上市:市值142亿港元 年营收5.8亿,净利163万
雷递网 雷建平 5月20日上海拓璞数控科技股份有限公司(简称:“拓璞数控”,股票代码:“07688”)今日在港交所上市。拓璞数控此次发售6533万股,发售价26.39港元,募资总额为17.24亿港元;…...
