二叉树数据结构:深入了解二叉树的概念、特性与结构

news2025/2/27 17:15:17

在探索栈和队列之后(大家可以移步至我的数据结构专栏):T-rLN的数据结构专栏

我们转向了更为复杂而有趣的数据结构——二叉树。本文将引领我们进入二叉树的世界,从最基本的概念和结构开始,逐步深入了解二叉树的顺序结构和链式结构


文章目录

  • 1.树概念和结构
    • 1.1树的概念
    • 1.2树的相关概念
    • 1.3树的表示
    • 1.4树的实际应用
  • 2.二叉树概念和结构
    • 2.1二叉树的概念
    • 2.2两种特殊二叉树
    • 2.3二叉树的性质
    • 2.5二叉树的储存结构


1.树概念和结构

1.1树的概念

请添加图片描述

树是一种抽象数据类型(ADT)非线性的数据结构,它由节点组成的集合构成,节点间通过边连接

它的命名灵感来源于现实生活中的树木结构。类似于自然界中树木的结构,树这一数据结构的视觉表示也呈现出分支延伸的形态,由根部向外延伸出分支,这种分支的结构特点赋予了数据结构树这一名称(一个倒挂的树)

  • 树中有一个特殊的节点,称为根节点,它位于树的顶部没有父节点(前驱节点)
  • 树中除根节点外,其他节点都被分成了若干个互不相交的集合,每个集合又形成了一棵类似于树的子树。这里的每个子树都类似于整体的树结构,它们都有一个根节点,这个根节点在当前子树中有且只有一个前驱节点(即父节点),但可以有零个或多个后继节点(子节点)
  • 这种定义描述了树这种数据结构的递归性质

请添加图片描述

但是要注意树形结构中,子树之间不能有交集,否则就不是树形结构

请添加图片描述

这些都不是树。 树的要求:

  • 子树不能相交
  • 除了根节点以外,其余节点只有一个父节点
  • 一个有哦X个节点的树,边的数量是X-1(梦回离散数学)

1.2树的相关概念

请添加图片描述

节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为4

叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、D、H、I…等节点为叶节点

非终端节点/分支节点:度不为0的节点; 如上图:C、E、G…等节点为分支节点

双亲节点/父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点

孩子节点/子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点

兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点

树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为4

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推(也有把跟视为第0层的);

树的高度或深度:树中节点的最大层次; 如上图:树的高度为4

节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙

森林多棵互不相交的树的集合称为森林

1.3树的表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值,也要保存结点和结点之间的关系。实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等

  1. 双亲表示法:在每个节点中存储一个指向其父节点的指针或索引
typedef struct {
    int data; // 节点数据
    PTNode* parent; // 指向父节点的指针或索引
} PTNode;

typedef struct {
    PTNode* nodes; // 存储所有节点的数组(要动态的)
    int n; // 树中当前节点数
} PTree;
  1. 孩子表示法:每个节点保存一个指向其第一个子节点的指针
  2. 孩子兄弟表示法(也叫作左孩子右兄弟表示法):每个节点有指向其第一个孩子的指针和指向其右兄弟的指针
typedef struct CSNode {
    int data; // 节点数据
    struct CSNode* firstChild; // 指向第一个子节点的指针
    struct CSNode* nextSibling; // 指向右兄弟节点的指针
} CSNode;

1.4树的实际应用

在 Linux 文件系统中,树形结构是文件和目录组织的基础。文件系统以树的形式组织文件和目录,根目录是整个文件系统的顶层,所有的文件和目录都从根目录开始分支。每个目录(包括根目录)都可以包含文件和其他目录

请添加图片描述


2.二叉树概念和结构

2.1二叉树的概念

二叉树是一种重要的树形数据结构,它由节点构成,每个节点最多有两个子节点(不是必须两个),分别称为左子节点和右子节点。这两个子节点通常称为左子树和右子树

请添加图片描述

从上图可看出:

  • 二叉树不存在度大于2的结点
  • 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

2.2两种特殊二叉树

  1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。换句话说,在满二叉树中每个节点都有两个子节点
  2. 完全二叉树:是一种特殊的二叉树,在一棵二叉树中,如果除了最底层,其他层的节点都是满的,并且最底层的节点都从左至右依次填满,这样的树被称为完全二叉树

满二叉树是一种特殊的完全二叉树

请添加图片描述

2.3二叉树的性质

  1. 若规定根节点的层数为1,则一棵非空二叉树的第n层上最多有 2 n − 1 2^{n-1} 2n1个结点(第一层 2 0 2^0 20,第二层 2 1 2^1 21);
  2. 若规定根节点的层数为1,则**深度为h的二叉树的最大结点数(节点总数)**是: 2 h − 1 2^h-1 2h1
  • 第一层(根节点层)有 1 个节点。
  • 第二层有最多 2 个节点。
  • 第三层有最多 4 个节点。
  • 第 ℎ 层有最多 2 h − 1 2^{h-1} 2h1个节点。

​ 所以,前 ℎh 层的节点数之和为 1+2+4+…+ 2 h − 1 2^{h-1} 2h1= 2 h − 1 2^{h}-1 2h1

  1. 若规定根节点的层数为1,具有n个结点的满二叉树的深度(h): l o g 2 ( n + 1 ) log_2(n+1) log2(n+1)

请添加图片描述

  1. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有
  • 若i>0,i位置节点的双亲序号:(i-1)/2 ; i=0,i为根节点编号,无双亲节点
  • 若2i+1<n,则左孩子坐标:2i+1;2i+1>=n否则无左孩子
  • 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

2.5二叉树的储存结构

  1. 顺序储存(数组):顺序结构存储就是使用数组来存储,一般数组只适合表示完全二叉树,因为不是完全二叉树空间的浪费比较大。而现实中使用中只有才会使用数组来存储。二叉树顺序存储在物理上是一个数组,在逻辑上(把它想象成,把它看作是)是一颗二叉树
  2. 链式储存(链表):二叉树的链式存储结构是指,用链表来表示一棵二叉树。通常的方法是链表中每个结点由三个域组成,数据域、左指针域和右指针域。左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址,数据域就存储数据

这次就到这里啦,下一次大概率是二叉树的顺序结构和堆的相关内容,感谢大家的支持!

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

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

相关文章

可用于blender制作3D动画的全身动捕设备

随着动捕设备的进步&#xff0c;在3D建模和动画制作领域中&#xff0c;动捕设备被广泛应用&#xff0c;以便创建更加真实和自然的角色动画。其中&#xff0c;blender作为一款开源的3D建模和动画软件&#xff0c;搭配全身动捕设备使用&#xff0c;更加激发了用户角色动画创作灵感…

【ARMv8M Cortex-M33 系列 2 -- Cortex-M33 JLink 连接 及 JFlash 烧写介绍】

文章目录 Jlink 工具JLink 命令行示例JFlash 烧写问题Jlink 工具 J-Link 是 SEGGER 提供的一款流行的 JTAG 调试器,它支持多个平台和处理器。JLink.exe 是 J-Link 调试器的命令行接口,它允许用户通过命令行执行一系列操作,例如编程、擦除、调试等。 工具链接: https://ww…

使用VMware创建CentOS7虚拟机详细教程

创建虚拟机 首先以管理员身份运行vmware17&#xff0c;进入后点击创建虚拟机。 直接点击下一步&#xff0c;开始自定义安装。 继续点击下一步 提前将iso文件准备好&#xff0c;这里用的是centos7&#xff0c;也可以使用其他系统的文件&#xff0c;然后点击下一步。 下来就是修…

IDEA、VSCode等快速连接Github(Mac版)

问题描述 在本地书写✍️完代码后, 想要git push到Github上面, 出现延迟错误; 导致经常push不上去, 如下图所示; 解决方案 进入电脑终端; 输入下列命令; sudo vim /etc/hosts输入密码; 按下 I 键, 进行编辑操作; 将下列语句复制到空白区, 然后按下esc按键, 然后输入:wq即可…

【计算机毕业设计】SSM医疗药品采购系统

项目介绍 ssm医疗药品采购系统。主要功能有&#xff1a; 用户管理&#xff1a;管理员列表&#xff1b; 采购管理&#xff1a;采购列表&#xff1b; 药品出库&#xff1a;药品出库&#xff1b; 库存管理&#xff1a;库存统计&#xff1b; 数据维护&#xff1a;药品列表、仓库…

计算机组成原理——存储器41-60

67、下列有关RAM和ROM得叙述中正确的是(A )。 I RAM是易失性存储器&#xff0c;ROM是非易失性存储器 II RAM和ROM都是采用随机存取方式进行信息访问 III RAM和ROM都可用做Cache IV RAM和ROM都需要进行刷新 A、 仅I和II B、仅I和III C、仅I &#xff0c;II&#xff0c; I…

Python:正则表达式速通,码上上手!

1前言 正则表达式&#xff08;Regular Expression&#xff09;是一种用来描述字符串模式的表达式。它是一种强大的文本匹配工具&#xff0c;可以用来搜索、替换和提取符合特定模式的文本。 正则表达式由普通字符&#xff08;例如字母、数字、符号等&#xff09;和元字符&#…

代码审计必要性探讨

1、背景 为了保证代码的质量&#xff0c;需要一系列的流程来进行保证&#xff1a; 今天要探讨的是代码审计的必要性。 2、代码审计 代码审计的做法多种多样&#xff0c;我理解必须解决以下问题 &#xff0c;才可能有效&#xff1a; 核心&#xff1a;审计的本质是对比&#…

SAP FI会计凭证的更改记录与EDI

要求当会计凭证进行增删改时&#xff0c;把会计凭证的内容记录到自定义表中&#xff0c;以便用后其它BW抽取&#xff0c; 一开始想到的当然是SAP标准记录的更改记录表&#xff1a;CDHDR&#xff0c;CDPOS表了&#xff0c;测试发现对会计凭证BKPF,BSEG的修改&#xff08;增加&a…

ubuntu22下安装minconda

bing 搜索 canda install 找到官方网站 https://docs.conda.io/projects/miniconda/en/latest/ 这里我们安装minconda。 官网有安装方法。 mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh…

Docker 部署RAP2

1、Github介绍 https://github.com/thx/rap2-delos 2、安装Docker环境 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce systemctl enable…

开发小程序和APP有什么区别?各自有什么优势?

开发小程序和APP的区别 ​ 用户范围&#xff1a;小程序主要针对微信用户&#xff0c;而APP则面向所有智能手机用户。 开发周期&#xff1a;小程序的开发周期相对较短&#xff0c;因为其基于微信平台等APP应用里的轻量级应用&#xff0c;有自身的开发规范要求。而APP开发则需要…

解决IDEA 不能正确识别系统环境变量的问题

问题描述 本人laptop 上的是设置了GOOGLE_APPLICATION_CREDENTIALS 这个环境变量的&#xff0c; 正常java or python 的程序能基于这个环境变量使用 某个gcp service account 去访问GCP的资源 [gatemanmanjaro-x13 ~]$ env | grep -i google GOOGLE_APPLICATION_CREDENTIALS/…

进程间通信---共享内存

共享内存的概念 共享内存 原理&#xff1a; 实现共享内存的步骤&#xff1a; 创建共享内存shmget&#xff08;&#xff09; 映射 共享内存 什么是映射&#xff1a;共享内存 映射 在不同进程中的地址不同。 把共享内存 从进程地址空间中脱离

BAQ压缩MATLAB仿真

本专栏目录: ​​​​​​​全球SAR卫星大盘点与回波数据处理专栏目录-CSDN博客 我们按照上一期文章的BAQ原理编写MATLAB代码,进行baq压缩与解压缩的全流程验证,并分析BAQ压缩对信号指标造成的影响。 生成3个点目标回波数据,加入高斯噪声,对回波进行BAQ压缩和解BAQ压缩,…

JavaScript练习题第(四)部分

大家好关于JavaScript基础知识点已经发布&#xff1a;需要的大家可以去我的主要查看 &#xff08;当然了有任何不会的&#xff0c;可以私信我&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 为了巩固大家学习知识点给大家准备几道练习题&#xff1a; 当然&…

Spring Boot项目Jar包加密:防止反编译的安全实践

文章目录 1. 引言2. 背景3. Jar包加密方案3.1 使用Java混淆工具3.2 使用Jar包加密工具3.2.1 示例&#xff1a;使用JCryptor对Jar包进行加密 4. 加密后的Jar包的运行5. 安全性与性能考虑5.1 安全性考虑5.2 性能考虑 6. 拓展功能与未来展望6.1 数字签名与验签6.2 使用加密算法库 …

gin框架使用系列之五——表单校验

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》《gin框架使用系列之四——json和protobuf的渲染》 一 、表单验证的基本理论 在第三篇中&#xff0c;我们介绍了如何…

3DV 2024 Oral | SlimmeRF:可动态压缩辐射场,实现模型大小和建模精度的灵活权衡

目前大多数NeRF模型要么通过使用大型模型来实现高精度&#xff0c;要么通过牺牲精度来节省内存资源。这使得任何单一模型的适用范围受到局限&#xff0c;因为高精度模型可能无法适应低内存设备&#xff0c;而内存高效模型可能无法满足高质量要求。为此&#xff0c;本文研究者提…

【奇技淫巧】OpenCV中Blob分析的两个关键技巧

Blob分析 BLOB是图像中灰度块的一种专业称呼&#xff0c;更加变通一点的可以说它跟我们前面二值图像分析的联通组件类似&#xff0c;通过特征提取实现常见的各种灰度BLOB对象组件检测与分离。使用该检测器的时候&#xff0c;可以根据需要输入不同参数&#xff0c;得到的结果跟…