【数据结构】详解二叉树

文章目录

  • 1.树的结构及概念
    • 1.1树的概念
    • 1.2树的相关结构概念
    • 1.3树的表示
    • 1.4树在实际中的应用
  • 2.二叉树的结构及概念
    • 2.1二叉树的概念
    • 2.2特殊的二叉树
      • 2.2.1满二叉树
      • 2.2.2完全二叉树
    • 2.3 二叉树的性质
    • 2.4二叉树的存储结构
      • 2.4.1顺序结构
      • 2.4.2链表结构

1.树的结构及概念

1.1树的概念

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
有一个特殊的结点,称为根结点根结点没有前驱结点除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
因此,树是递归定义的
在这里插入图片描述

1.2树的相关结构概念

在这里插入图片描述

在一个树中,有下面几种结构概念:

结点的度:一个结点含有的子树的个数称为该结点的度; 如上图:A的为6,我们用一张图来更好的了解:
在这里插入图片描述

叶结点或终端结点:度为0的结点称为叶结点; 如上图:B、C、H、I…等结点为叶结点
非终端结点或分支结点:度不为0的结点; 如上图:D、E、F、G…等结点为分支结点
双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父结点
孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点; 如上图:B是A的孩子结点
兄弟结点:具有相同父结点的结点互称为兄弟结点; 如上图:B、C是兄弟结点
树的度:一棵树中,最大的结点的度称为树的度; 如上图:树的度为6
结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推;
树的高度或深度:树中结点的最大层次; 如上图:树的高度为4
堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:H、I互为兄弟结点
结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先
子孙:以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是A的子孙
森林:由m(m>0)棵互不相交的树的集合称为森林;
这里面的概念我们不需要全都记住,标黄的需要我们重点关注以下;

1.3树的表示

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

typedef int DataType;
struct Node
{
	struct Node* firstChild1;  // 第一个孩子结点   
	struct Node* pNextBrother;  // 指向其下一个兄弟结点  
	DataType data;   		    // 结点中的数据域            
};
 

在这里插入图片描述
在这个方法中,我们用firstchild指针找当前节点的第一个孩子节点(A),再用pnextbrother指针找到后续的孩子节点(B,C)找完之后接着用firstchild找到D,然后重复上面的操作,直到找完为止;

1.4树在实际中的应用

在这里插入图片描述

2.二叉树的结构及概念

2.1二叉树的概念

二叉树(Binary Tree) 是由n个结点构成的有限集(n≥0),该集合:

  1. 或者为空;
  2. 由一个根结点加上两棵别称为左子树和右子树的二叉树组成;
    在这里插入图片描述
    由上图我们可以得知:
    1.一个二叉树不存在度大于2的结点。
    2.二是结点的子树有左右之分,不能随意调换,调换后又是一棵新的二叉树。
对于任意一个二叉树都是由以下几种情况复合而成的;

在这里插入图片描述

2.2特殊的二叉树

在这里插入图片描述

2.2.1满二叉树

满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是
说,如果一个二叉树的层数为K,且结点总数是,则它就是满二叉树。

2.2.2完全二叉树

完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。
对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
** 要注意的是满二叉树是一种特殊的完全二叉树**。

2.3 二叉树的性质

  1. 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2^( i-1) 个结点.
  2. 若规定根结点的层数为1,则深度为h的二叉树的最大结点数是2^h -1.
  3. 对任何一棵二叉树, 如果度为0其叶结点个数为 n,度为2的分支结点个数为 m
    ,则有n=m+1;
  4. 若规定根结点的层数为1具有n个结点的满二叉树的深度,h= . (ps:是log以2
    为底,n+1为对数)
  5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有结点从0开始编号,则对
    于序号为i的结点有:
    . 1.若i>0,i位置结点的双亲序号:(i-1)/2;i=0,i为根结点编号,无双亲结点;
    . 2.若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子;
    . 3.若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子;

2.4二叉树的存储结构

2.4.1顺序结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。

  1. 顺序存储
    顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空
    间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺
    序存储在物理上是一个数组,在逻辑上是一颗二叉树。

在这里插入图片描述
在这里插入图片描述

2.4.2链表结构

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是:
链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所
在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面学到高阶数据结构如红黑树等会用到三叉链。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

乐观锁 or 悲观锁 你怎么选?

你有没有听过这样一句话&#xff1a;悲观者正确&#xff0c;乐观者成功​。那么今天我来分享下什么是乐观锁​和悲观锁。 乐观锁和悲观锁有什么区别&#xff0c;它们什么场景会用 乐观锁 乐观锁基于这样的假设&#xff1a;多个事务在同一时间对同一数据对象进行操作的可能性很…

三体中的冯诺依曼

你叫冯诺依曼&#xff0c;是一位科学家。你无法形容眼前的现态&#xff0c;你不知道下一次自己葬身火海会是多久&#xff0c;你也不知道会不会下一秒就会被冰封&#xff0c;你唯一知道的&#xff0c;就是自己那寥寥无几的科学知识&#xff0c;你可能会抱着他们终身&#xff0c;…

基于Android Studio记事本系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 具有登录&#xff0c;注册&#xff0c;记住密码&#xff0c;自动登录的功能&#xff1b; 可以新增记事本&#xff0c;编辑&#xff0c;删除记事本信息&#xff0c;同时可以设置主标题&#xff0c;内容&#xff0c;以及…

SpringBoot【1】集成 Druid

SpringBoot 集成 Druid 前言创建项目修改 pom.xml 文件添加配置文件开发 java 代码启动类 - DruidApplication配置文件-propertiesDruidConfigPropertyDruidMonitorProperty 配置文件-configDruidConfig 控制层DruidController 运行验证Druid 的监控应用程序 前言 JDK版本&…

【HarmonyOS - ArkTS - 状态管理】

概述 本文主要是从页面和应用级两个方面介绍了ArkTS中的状态管理的一些概念以及如何使用。可能本文比较粗略&#xff0c;细节化请前往官网(【状态管理】)学习&#xff0c;若有理解错误的地方&#xff0c;欢迎评论指正。 装饰器总览 由于下面会频繁提及到装饰器&#xff0c;所…

【CH32V305FBP6】调试入坑指南

1. 无法烧录程序 现象 MounRiver Studio WXH-LinkUtility 解决方法 前提&#xff1a;连接复位引脚 或者 2. 无法调试 main.c 与调试口冲突&#xff0c;注释后调试 // USART_Printf_Init(115200);

orin部署tensorrt、cuda、cudnn、pytorch、onnx

绝大部分参考https://blog.csdn.net/qq_41336087/article/details/129661850 非orin可以参考https://blog.csdn.net/JineD/article/details/131201121 报错显卡驱动安装535没法安装、原始是和l4t-cuda的部分文件冲突 Options marked [*] produce a lot of output - pipe it t…

三方语言中调用, Go Energy GUI编译的dll动态链接库CEF

如何在其它编程语言中调用energy编译的dll动态链接库&#xff0c;以使用CEF 或 LCL库 Energy是Go语言基于LCL CEF开发的跨平台GUI框架, 具有很容易使用CEF 和 LCL控件库 interface 便利 示例链接 正文 为方便起见使用 python 调用 go energy 编译的dll 准备 系统&#x…

使用compile_commands.json配置includePath环境,解决vscode中引入头文件处有波浪线的问题

通过编译时生成的 compile_commands.json 文件自动完成对 vscode 中头文件路径的配置&#xff0c;实现 vscode 中的代码的自动跳转。完成头文件路径配置后&#xff0c;可以避免代码头部导入头文件部分出现波浪线&#xff0c;警告说无法正确找到头文件。 步骤 需要在 vscode 中…

Linux--进程间通信(1)(匿名管道)

目录 1.了解进程通信 1.1进程为什么要通信 1.2 进程如何通信 1.3进程间通信的方式 2.管道 2.1管道的初步理解 2.2站在文件描述符的角度-进一步理解管道 2.3 管道的系统调用接口&#xff08;匿名管道&#xff09; 2.3.1介绍接口函数&#xff1a; 2.3.2编写一个管道的代…

windows系统配置dns加快访问github 实用教程一(图文保姆级教程)

第一步、打开网页 https://tool.lu/ip IP地址查询 - 在线工具 输入www.github.com 或者github.com 点击网页查询按钮, 获取对应github网站对应的ip 完整操作步骤如上图所示,可以很清晰的看到github网站的ip显示地区是美国也就是说该网站服务器是在国外, 这也就是为什么我们在…

IDEA 中导入脚手架后该如何处理?

MySQL数据库创建啥的&#xff0c;没啥要说的&#xff01;自行配置即可&#xff01; 1.pom.xml文件&#xff0c;右键&#xff0c;add Maven Project …………&#xff08;将其添加为Maven&#xff09;【下述截图没有add Maven Project 是因为目前已经是Maven了&#xff01;&…

redis 高可用及哨兵模式 @by_TWJ

目录 1. 高可用2. redis 哨兵模式3. 图文的方式让我们读懂这几个算法3.1. Raft算法 - 图文3.2. Paxos算法 - 图文3.3. 区别&#xff1a; 1. 高可用 在 Redis 中&#xff0c;实现 高可用 的技术主要包括 持久化、复制、哨兵 和 集群&#xff0c;下面简单说明它们的作用&#xf…

今日分享丨按场景定制界面

遇到问题 我们在写文档或者代码时&#xff0c;会遇到需要书写重复或者类似内容的情况。快捷的做法是&#xff1a;先复制粘贴此相似内容&#xff0c;再修改差异。那么开发人员在设计界面的时候&#xff0c;也会遇到同类型的界面有重复的特性&#xff0c;比如报销类型的单据&…

ArcGIS模型构建器实例:一键拓扑(附模型下载)

ArcGIS模型构建器特别适用于流程固定的工作流。 要素的拓扑处理就非常符合这一特点&#xff0c;一个要素的拓扑过程基本固定&#xff0c;但是每次拓扑都要来一轮操作就很烦&#xff0c;这正是模型构建器的用武之地。 下面以ArcGIS Pro为例介绍在模型构建器中的整个拓扑流程&a…

2024山软创新实训:软件系统架构

软件架构 本文着重介绍本应用&#xff1a;基于开源LLM的易学大模型软件系统的架构。在经过2个月的探索、选型、实验、开发后&#xff0c;我们团队终于把整个系统的各块拼图搭建了起来&#xff0c;现在剩下的是集成、评测、优化和部署的工作。 1. Distributed System 整个项目…

echarts 环形图

环形图封装成了一个组件 组件名diagran.vue <!--环形图--> <template><div classchartPreDonut refchartPreDonut></div> </template><script> import * as echarts from echarts export default {props: [option, unit, title, center, …

UE5 Cesium2 最新使用地理配准子关卡构造全球场景

参考官方最新教程&#xff1a;Building Global Scenes with Georeferenced Sublevels – Cesium 创建持久关卡&#xff08;主关卡&#xff09; 这里一般包含DynamicPawn、CesiumSunSky 和 Cesium World Terrain 全球场景通用的对象。子关卡的创立&#xff0c;官方教程分为了两…

【SQL学习进阶】从入门到高级应用(八)

文章目录 ✨连接查询✨什么是连接查询✨连接查询的分类✨笛卡尔积现象✨内连接✨什么叫内连接✨内连接之等值连接✨内连接之非等值连接✨内连接之自连接 ✨外连接✨什么叫外连接✨外连接之左外连接&#xff08;左连接&#xff09;✨外连接之右外连接&#xff08;右连接&#xf…

Vue3兼容低版本浏览器(ie11,chrome63)

1、插件安装 为了使你的项目兼容 Chrome 63&#xff0c;你需要确保包含适当的 polyfills 和插件配置。你已经在使用 legacy 插件&#xff0c;但在代码中可能缺少一些配置或插件顺序有问题。以下是几个可能的改进&#xff1a; 安装 vitejs/plugin-legacy 插件&#xff1a; 确保…