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

在探索栈和队列之后(大家可以移步至我的数据结构专栏):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://xiahunao.cn/news/2659293.html

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

相关文章

听GPT 讲Rust源代码--src/tools(30)

File: rust/src/tools/clippy/clippy_lints/src/casts/cast_slice_from_raw_parts.rs 在Rust源代码中&#xff0c;cast_slice_from_raw_parts.rs文件位于rust/src/tools/clippy/clippy_lints/src/casts/目录下&#xff0c;它是Clippy工具中的一个lint&#xff0c;用于检查通过f…

【技巧】7z分卷压缩文件如何解压?

7z分卷压缩格式是一种常用的文件压缩格式&#xff0c;可以在压缩文件时将文件分割成多个独立的文件&#xff0c;更方便储存或者传输。那压缩好的7z分卷文件要如何解压呢&#xff1f;不清楚的小伙伴一起来看看吧。 想要解压7z分卷压缩文件&#xff0c;需要用到支持7z格式的解压…

Springboot拦截器及统一异常处理

文章目录 一、Java中异常相关概念1、异常类2、异常处理方法3、注意事项4、自定义异常 二、配置全局异常处理1、统一返回体定义2、定义异常处理实现类3、全局异常处理类 三、Springboot拦截器1、定义拦截器2、注册拦截器 四、验证效果 一、Java中异常相关概念 1、异常类 Throw…

微信小程序登录用户信息、手机号、照片等隐私api不能使用解决的方案

问题 突然小程序不能使用用户信息、手机号、图片上传的功能 例如这种错误 "getUserProfile:fail api scope is not declared in the privacy agreement" 定位问题 经过微信社区查询得知 为规范开发者的用户个人信息处理行为&#xff0c;保障用户的合法权益&…

(2)llvm解析器和抽象语法树

解析器的输出是抽象语法树 对于数字字面量&#xff0c;创造了一个实例&#xff0c;并捕捉 变量捕捉函数名&#xff1b;二元表达式捕捉运算符&#xff1b;函数调用捕捉函数名和函数调用参数 函数原型和函数定义 构建语法树 getNextToken会从输入流里拿一个token&#xff0c;Cur…

2023年中职“网络安全”——B-5:网络安全事件响应(Server2216)

B-5&#xff1a;网络安全事件响应 任务环境说明&#xff1a; 服务器场景&#xff1a;Server2216&#xff08;开放链接&#xff09; 用户名:root密码&#xff1a;123456 1、黑客通过网络攻入本地服务器&#xff0c;通过特殊手段在系统中建立了多个异常进程&#xff0c;找出启…

医院安全(不良)事件报告系统源码 支持二次开发、支持源码交付

医疗不良事件报告系统源码旨在建立全面的、统一的医疗不良事件标准分类系统和患者安全术语&#xff0c;使不良事件上报管理更加标准化和科学化。通过借鉴国内外医疗不良事件报告系统的先进经验&#xff0c;根据医疗不良事件的事件类型、处理事件的不同部门&#xff0c;灵活设置…

How to Develop Word Embeddings in Python with Gensim

https://machinelearningmastery.com/develop-word-embeddings-python-gensim/ 本教程分为 6 个部分;他们是&#xff1a; 词嵌入 Gensim 库 开发 Word2Vec 嵌入 可视化单词嵌入 加载 Google 的 Word2Vec 嵌入 加载斯坦福大学的 GloVe 嵌入 词嵌入 单词嵌入是一种提供单词的…

Android Jetpack之用Room+ViewModel+LiveData实现增删改查数据(createFromAsset())

文章目录 一、Room简介二、用RoomViewModelLiveData增删改查数据三、下载源码 一、Room简介 Room是Google推出的数据库框架&#xff0c;是一个 ORM (Object Relational Mapping)对象关系映射数据库、其底层还是对SQLite的封装。 Room包含三个主要组件&#xff1a; 数据库类&…

润和软件HopeStage与亚信安全云主机深度安全防护系统完成产品兼容性互认证

近日&#xff0c;江苏润和软件股份有限公司&#xff08;以下简称“润和软件”&#xff09;HopeStage 操作系统与亚信科技&#xff08;成都&#xff09;有限公司&#xff08;以下简称“亚信安全”&#xff09;云主机深度安全防护系统完成兼容性测试。 测试结果表明&#xff0c;企…

golang并发安全-sync.map

sync.map解决的问题 golang 原生map是存在并发读写的问题&#xff0c;在并发读写时候会抛出异常 func main() {mT : make(map[int]int)g1 : []int{1, 2, 3, 4, 5, 6}g2 : []int{4, 5, 6, 7, 8, 9}go func() {for i : range g1 {mT[i] i}}()go func() {for i : range g2 {mT[…

Mysql 将数据按照年月分组 统计

要的效果: 方案&#xff1a; ① 使用 DATE_FORMAT(date, ‘%Y-%m-%d’) 函数 DATE_FORMAT 怎么去使用格式化&#xff0c;取决于后面的格式模式。 我们这里只是想区分到年 、月&#xff0c; 所以我们的sql 里面使用 %Y-%m : SELECT DATE_FORMAT(create_time, %Y-%m) AS …

Bind for 0.0.0.0:2379 failed: port is already allocated

1、执行命令docker-compose -p docker-apisix up -d 报错 Error response from daemon: driver failed programming external connectivity on endpoint docker-apisix-etcd-1 (2a92a0cefff9194fcd1dad4bdeabf4201d9047ec2633eda455c6e46528668af4): Bind for 0.0.0.0:2379 fa…

c++输入输出流和文件操作总结

目录 一、c的输入输出流——> 指的是字节流的数据传送;具有类型安全和可扩展性。 二、流的出入路径 三、c流类库 ①概览 ②标准输出流&#xff1a; ③标准输入流&#xff1a; 四、文件操作&#xff08;ascii文件和二进制文件&#xff09; 五、字符串流&#xff08;或称…

【力扣题解】P94-二叉树的中序遍历-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P94-二叉树的中序遍历-Java题解&#x1f30f;题目描述&#x1f4a1;题解&#x1f30f…

oracle与mysql的分析函数(窗口函数)

分析函数定义 在SQL语句中&#xff0c;很多查询语句需要进行GROUP BY分组汇总&#xff0c;但是一旦经过分组&#xff0c;SELECT返回的记录数就会减少。为了保留所有原始行记录&#xff0c;并且仍可以进行分组数据分析&#xff0c;分析函数应运而生。 Oracle 8i 版本开始支持窗…

C++实现令牌桶过滤算法

什么是令牌桶算法 令牌桶算法通过限制令牌桶的固定容量&#xff0c;实现对资源以及流量的延迟控制。请求者需先获取令牌&#xff0c;方可执行动作。若令牌桶内具有足够令牌便可通过消耗相等数量放过请求&#xff1b;而若令牌不足&#xff0c;则会拒绝请求。 该算法具备平滑的…

C语言停车场模型详解

C语言停车场模型详解 1. 引言2. 代码概述3. 代码详解3.1 定义常量和数据结构3.2 初始化车库3.3 查找车辆所在车库3.4 查找车辆所在的车位3.5 打印车库状态3.6 打印等候车辆3.7 车辆入库3.8 车辆出库3.9 菜单功能3.10 主函数 5.效果展示5.完整代码6. 总结 1. 引言 本文将介绍一…

Android : 画布绘制矩形和文字 让其居中显示简单应用

示例图&#xff1a; CenterView.java package com.example.demo;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.View;public class Center…

生成式 AI 原生开发

如何成为生成式AI原生开发者&#xff0c;快速进入&#xff1a; 下一站 GenAI QCon 上海站喊你上车啦&#xff01; 无限构建&#xff0c;成为生成式 AI 原生开发者&#xff0c;12 月 28 日&#xff0c;下一站 GenAI 巴士即将抵达 QCon 全球软件开发大会上海站&#xff0c;码…