【数据结构】树的定义

在计算机科学中,树(Tree)是一种重要的基础数据结构,广泛应用于许多领域,如文件系统的目录结构、数据库的索引、编译器的语法树、人工智能的决策树等。理解树的基本概念和术语,对于学习计算机科学及其相关技术具有重要的意义。本篇博客将通过清晰的定义和图示,带领大家逐步了解树的基础知识,适合初学者进行学习和掌握。

文章目录

    • 什么是树?
      • 基本定义
      • 空树与非空树
      • 树的表示
    • 树的常见术语
      • 节点(Node)
      • 根节点(Root Node)
      • 父节点和子节点(Parent and Child)
      • 兄弟节点(Sibling)
      • 叶子节点(Leaf Node)
      • 度(Degree)
      • 深度(Depth)
      • 高度(Height)
      • 层次(Level)
      • 树的高度
    • 树的类型
      • 有序树与无序树
      • 二叉树(Binary Tree)
      • 完全二叉树(Complete Binary Tree)
      • 平衡二叉树(Balanced Binary Tree)
      • 搜索树(Search Tree)
      • AVL树和红黑树
    • 森林
    • 树的操作
    • 小结

在这里插入图片描述

什么是树?

基本定义

树是一种非线性的数据结构,它由若干节点和连接这些节点的边构成。树的特点是层次性,即每个节点与其子节点之间有明确的父子关系。树的每个节点可以有多个子节点,但只能有一个父节点。树结构具有递归性质:树的子树本身仍然是树。树具有许多重要的应用,比如表示层次关系、组织数据结构、实现高效的查找等。

空树与非空树

树的概念也包括空树。空树是指没有任何节点的树,节点数为0,通常我们不关心空树的结构。在计算机中,空树可以作为递归算法的基准条件,即当树为空时,递归停止。

对于非空树来说,它总是有且仅有一个根节点。根节点是树的最上层节点,所有其他节点都可以通过根节点间接访问到。

树的表示

树的结构通常由节点和边来表示。每个节点包含一个数据元素(值),并通过边与其他节点连接。树的根节点是整个树的起始点,而树的其他节点通过边与根节点或其他节点相连,形成一个层次结构。

在这里插入图片描述

树的常见术语

节点(Node)

树的每个元素都叫做一个节点。节点包含两部分内容:数据(值)和指向子节点的指针。树的节点是构建整个树的基本单元。

根节点(Root Node)

根节点是树的起始节点,树的所有其他节点都可以通过根节点访问。树中只有一个根节点,因此根节点是唯一的。对于每棵树来说,根节点的层次是0。

父节点和子节点(Parent and Child)

在树中,节点之间通过边进行连接,节点间的关系是父子关系。假设节点A通过一条边连接到节点B,那么节点A就是节点B的父节点,节点B则是节点A的子节点。每个节点最多只有一个父节点,但可以有多个子节点。

兄弟节点(Sibling)

在树中,具有相同父节点的节点被称为兄弟节点。例如,如果节点A和节点B有相同的父节点P,那么A和B就是兄弟节点。

叶子节点(Leaf Node)

叶子节点是没有子节点的节点,度为0。它是树的最底层节点,通常出现在树的末端。叶子节点在树的遍历中通常是访问的终点。

度(Degree)

节点的度是指该节点所拥有的子节点的数量。度可以用来描述树结构的“宽度”,即一个节点可以有多少个分支。例如,度为0的节点是叶子节点,而度大于0的节点则是分支节点。

树的度通常是指所有节点中度的最大值。换句话说,树的度就是树中最“宽”节点的度。

深度(Depth)

节点的深度是指从根节点到该节点的路径上的边的数量。根节点的深度为0,而根节点的直接子节点的深度为1,依此类推。深度反映了节点距离树根的远近。

高度(Height)

节点的高度是指从该节点到树的最远叶子节点的路径上的边的数量。换句话说,节点的高度是从该节点开始,经过多少层的子节点才能到达叶子节点。树的高度是树中所有节点高度的最大值,通常是树的最深层次。

层次(Level)

节点的层次即深度,表示从根节点开始的第几层。根节点是第一层,其子节点是第二层,以此类推。层次有助于表示树的结构层次感。

树的高度

树的高度是指树中根节点到最远叶子节点的最长路径上边的数量。树的高度等于树中节点的最大深度。树的高度通常用来描述树的深度,影响树的遍历和操作效率。

在这里插入图片描述

树的类型

我们先简单了解一下常见树的类型,对于重要的树结构和特性我们会在后期逐步介绍,敬请关注。

有序树与无序树

树可以分为有序树和无序树。不同之处在于子节点的顺序是否重要:

  • 有序树:有序树中的子节点顺序是固定的,不能随意改变。换句话说,在有序树中,节点的排列顺序是有意义的。常见的应用如表达式树,其中操作数和操作符的顺序是必须严格保持的。
  • 无序树:无序树中的子节点顺序不重要,节点可以自由交换位置。无序树适用于那些对子节点顺序没有特定要求的场景,如文件系统中的目录树。

二叉树(Binary Tree)

二叉树是一种特殊的树,每个节点最多有两个子节点,通常分别称为左子节点和右子节点。二叉树在许多算法和数据结构中有广泛应用,比如二叉查找树、堆、平衡二叉树等。

完全二叉树(Complete Binary Tree)

完全二叉树是指一棵二叉树,除了最后一层外,每一层的节点数都达到最大值,且最后一层的节点尽可能集中在左边。完全二叉树是一种非常平衡的二叉树结构。

平衡二叉树(Balanced Binary Tree)

平衡二叉树是一种特殊的二叉树,它满足以下条件:任何节点的左子树和右子树的高度差不超过1。平衡二叉树常用于保持高效的查找、插入和删除操作,如AVL树和红黑树。

搜索树(Search Tree)

搜索树,尤其是二叉搜索树(BST),是一种特殊的二叉树,它满足以下条件:对于树中的每个节点,左子树的所有节点的值小于该节点的值,右子树的所有节点的值大于该节点的值。这使得二叉搜索树能够高效地进行查找、插入和删除操作。

AVL树和红黑树

AVL树和红黑树都是自平衡二叉搜索树的实现。它们通过一些旋转操作来保持树的平衡性,从而保证在最坏情况下依然能提供对数时间复杂度的查找、插入和删除操作。

森林

所谓森林就说由m棵不相交的树的集合,树可以为空树,所以森林也是可以为空森林(如图所示)。

在这里插入图片描述

树的操作

树的操作包括节点的插入、删除、查找、遍历等。以下是常见的几种操作:

  • 插入操作:向树中插入一个新节点。在二叉搜索树中,插入操作需要根据节点值的大小来决定插入的位置。
  • 删除操作:删除树中的一个节点。删除操作通常较为复杂,特别是在树中间节点删除时,需要重新调整树的结构。
  • 查找操作:查找树中的某个节点或值。查找操作通常利用树的层次结构进行优化,如在二叉搜索树中,查找过程可以通过比较节点值的大小,快速定位目标节点。
  • 遍历操作:遍历树是指按照一定的顺序访问树中的每个节点。常见的遍历方式有:先序遍历、中序遍历、后序遍历和层次遍历(重点内容,后期逐步介绍)。

小结

树是一种非常重要的基础数据结构,广泛应用于各个计算机领域。。树不仅是算法设计中不可或缺的工具,还是很多实际问题解决中的关键数据结构。我们后续会不断更新数据结构相关的内容,感兴趣的化可以给我点点关注支持支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三个shell脚本

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 测试结果: 2、写一个 shel1 脚本,实现批量添加 20个用户,用户名为user01-20,密码为user 后面跟5个随机字符。 3、编写个shell脚本将/usr/local 日录…

读书笔记--共享服务中心建设原则

最近阅读了《企业IT架构转型之道》记录和思考如下,供大家学习参考。随着企业的数字化转型推进,很多企业开始从原来的SPA模式应用转变为平台技术应用,比如阿里巴巴的共享服务中心,传统企业的统一认证的share服务等等。可以说&#…

【Ubuntu与Linux操作系统:五、文件与目录管理】

第5章 磁盘存储管理 5.1 Linux磁盘存储概述 磁盘存储是Linux系统存储数据的重要组件,它通过分区和文件系统组织和管理数据。Linux支持多种文件系统,如ext4、xfs和btrfs,并以块的形式管理存储设备。 1. 分区与文件系统: 分区&am…

DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议

文章目录 Pre概述业务流程需求分析的困境统一语言建模事件风暴会议什么是事件风暴(Event Storming)事件风暴会议 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对…

【C语言系列】函数递归

函数递归 一、递归是什么?1.1尾递归 二、递归的限制条件三、递归举例3.1举例一:求n的阶乘3.2举例二:顺序打印一个整数的每一位 四、递归与迭代4.1举例三:求第n个斐波那契数 五、拓展学习青蛙跳台问题 一、递归是什么? …

css盒子水平垂直居中

目录 1采用flex弹性布局: 2子绝父相margin:负值: 3.子绝父相margin:auto: 4子绝父相transform: 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接:文字水平垂直居中-CSDN博客 以下为盒子…

攻防世界 Web_php_wrong_nginx_config

​ 打开题目地址,显示为登录页面。尝试用御剑扫描一下,发现了admin页面,点进去显示如下 点开控制台,发现如下 isLogin参数为0。尝试抓包并该islogin参数为1,返回依旧不变。 再扫描,发现robots.txt&#xff…

YOLOv10-1.1部分代码阅读笔记-plotting.py

plotting.py ultralytics\utils\plotting.py 目录 plotting.py 1.所需的库和模块 2.class Colors: 3.class Annotator: 4.def plot_labels(boxes, cls, names(), save_dirPath(""), on_plotNone): 5.def save_one_box(xyxy, im, filePath("im.jpg&qu…

HTML5实现好看的端午节网页源码

HTML5实现好看的端午节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 端午节由来界面1.4 端午节习俗界面1.5 端午节文化界面1.6 端午节美食界面1.7 端午节故事界面1.8 端午节民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 H…

net-http-transport 引发的句柄数(协程)泄漏问题

Reference 关于 Golang 中 http.Response.Body 未读取导致连接复用问题的一点研究https://manishrjain.com/must-close-golang-http-responsehttps://www.reddit.com/r/golang/comments/13fphyz/til_go_response_body_must_be_closed_even_if_you/?rdt35002https://medium.co…

关于husky8.0 与 4.0的配置

husky的场景使用很多,一般大多场景是在配置git commit 命令拦截hook, 校验 commit-msg 格式规范。以下环境默认:git > 2.27.0, node >14 1、安装huskey8.0.1 npm install --save-dev husky8.0.1 2、初始化配置文件 在package.json scripts 属性…

CV(9)--迁移学习

前言 仅记录学习过程,有问题欢迎讨论 fine-tuning 在实践中,由于数据集不够大,很少有人从头开始训练网络。常见的做法是使用预训练的网络 (例如在ImageNet上训练的分类1000类的网络)来重新fine-tuning(也…

LS1046+XILINX XDMA PCIE调通

欢迎点赞收藏,欢迎私下讨论技术,分享技术 硬件平台 :NXP LS1046 XILINX FPGA 软件平台:LINUX 4.19.68 buildroot LS1046 PEX3 接 XILINX FPGA,linux使用designware的PCI主控制器。下载XILINX DMA驱动,解…

免杀0到1--ShellCode存放方式

示例&#xff1a;指针运行 通过修改内存属性、修改data段属性、新增数据段等方式改变shellcode的存放位置&#xff0c;以此达到规避杀软的一个效果。 1.原始版本 #include <Windows.h> #include <stdio.h> #pragma comment(linker,"/subsystem:\"Window…

C语言gdb调试

目录 1.gdb介绍 2.设置断点 2.1.测试代码 2.2.设置函数断点 2.3.设置文件行号断点 2.4.设置条件断点 2.5.多线程调试 3.删除断点 3.1.删除指定断点 3.2.删除全部断点 4.查看变量信息 4.1.p命令 4.2.display命令 4.3.watch命令 5.coredump日志 6.总结 1.gdb介绍…

Unity动态图集技术

.背景 首先&#xff0c;为什么需要动态图集&#xff1f;主要有两个原因&#xff1a; 游戏中的icon数量相当大&#xff0c;数量达到上千个。如果打成静态图集&#xff0c;需要好几张2048x2048的图集。运行时内存占用较大。同时&#xff0c;在这种情况下&#xff0c;由于icon会跨…

[程序设计]—代理模式

[程序设计]—代理模式&#x1f473; 本文章记录学习于——52.面向切面&#xff1a;AOP-场景模拟_哔哩哔哩_bilibili 最近闲来无事&#xff0c;在学习Spring的源码&#xff1a; 后面慢慢更新源码系列blog&#xff0c;希望多多关注&#x1f64f;&#x1f64f; 目前已经总结的b…

我的128天创作之路:回顾与展望

大家好呀&#xff01;今天来和你们分享一下我的创作历程&#x1f601;。 一、机缘 最开始创作呢&#xff0c;是因为在学习 C 的 STL 时&#xff0c;像 string、list、vector 这些模板可把我折腾得够呛&#xff0c;但也让我学到了超多东西&#xff01;我就想&#xff0c;要是把我…

线上服务怎么记录每次fullgc的dump文件

目录 使用JVM参数配置 使用命令行工具 注意事项 在线上服务中,记录每次Full GC的dump文件可以帮助开发者深入分析垃圾回收行为,优化JVM性能。以下是一些相关命令和步骤: 使用JVM参数配置 启用GC日志: 通过JVM参数-Xloggc指定GC日志的输出路径,例如-Xloggc:/path/to/gc…

RAID储存技术

RAID独立磁盘冗余技术是一种把2个或者多个HDD或SSD合并为一个协调的存储单元或列阵&#xff0c;从而预防数据丢失的技术&#xff0c;其最早由加州大学伯克利分校的计算机科学家David Patterson、Garth Gibson和Randy Katz在1987年提出。他们的研究论文“关于RAID的论证”提出了…