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

在探索栈和队列之后(大家可以移步至我的数据结构专栏):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. 链式储存(链表):二叉树的链式存储结构是指,用链表来表示一棵二叉树。通常的方法是链表中每个结点由三个域组成,数据域、左指针域和右指针域。左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址,数据域就存储数据

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

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

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

相关文章

Postman使用

Postman使用 Pre-request Script 参考&#xff1a; Scripting in Postman 可以请求、集合或文件夹中添加Pre-request Script&#xff0c;在请求运行之前执行JavaScript 如设置变量值、参数、Header和正文数据&#xff0c;也可以使用Pre-request Script来调试代码&#xff0…

解决Hive在DataGrip 中注释乱码问题

注释属于元数据的一部分&#xff0c;同样存储在mysql的metastore库中&#xff0c;如果metastore库的字符集不支持中文&#xff0c;就会导致中文显示乱码。 不建议修改Hive元数据库的编码&#xff0c;此处我们在metastore中找存储注释的表&#xff0c;找到表中存储注释的字段&a…

【汇编笔记】初识汇编-内存读写

汇编语言的由来&#xff1a; CPU是计算机的核心&#xff0c;由于计算机只认识二进制&#xff0c;所以CPU执行的指令是二进制。 我们要想让CPU工作&#xff0c;就得给他提供它认识的指令&#xff0c;这一系列的指令的集合&#xff0c;称之为指令集。 指令集&#xff1a; 不同的体…

VR全景图片制作时有哪些技巧,VR全景图片能带来哪些好处

引言&#xff1a; VR全景图片是通过虚拟现实技术制作出的具有沉浸感的图片&#xff0c;能够提供给用户一种身临其境的感觉。在宣传方面&#xff0c;它有着独特的优势和潜力&#xff0c;能够帮助吸引更多的潜在客户&#xff0c;那么VR全景图片制作时有哪些技巧&#xff0c;VR全…

【科普】家长们:如何早期发现孩子的听力问题?

孩子太小还不会说话&#xff0c; 或表达不准确&#xff0c; 家长往往很难发现他们听力下降&#xff1b; 那在生活中 如何发现孩子听力异常呢&#xff1f; 1、新生儿听力筛查 每一个新生儿出生后都要求做听力筛查&#xff0c;这样可以及早判断是否存在听力障碍的可能&#…

【Java 进阶篇】Jedis 操作 Set 与 SortedSet 详解

Redis 是一个强大的键值存储系统&#xff0c;而 Jedis 是 Redis 的 Java 客户端&#xff0c;为 Java 开发者提供了方便的操作接口。在这篇博客中&#xff0c;我们将深入探讨 Jedis 如何操作 Redis 中的 Set 和 SortedSet 数据结构。无论你是初学者还是有一些经验的开发者&#…

javaEE -18(11000字 JavaScript入门 - 3)

一&#xff1a;事件 &#xff08;高级&#xff09; 1.1 注册事件&#xff08;绑定事件&#xff09; 给元素添加事件&#xff0c;称为注册事件或者绑定事件&#xff0c;注册事件有两种方式&#xff1a;传统方式和方法监听注册方式 传统注册方式 &#xff1a; 利用 on 开头的…

dvwa问题篇 -- dvwa出现数据库无法访问的时候,Could not connect to the MySQL service. -- 小黑解决教程

各位小伙伴初次玩dvwa会出现各种问题&#xff0c;本来想把一些问题直接总结写一篇dvwa文章来着&#xff0c;但因为都是关键字搜索&#xff0c;所以将一些问题都拆分出来&#xff0c;以便大家方便查类似问题。&#xff08;大家有遇到不一样的问题欢迎投稿&#xff01;&#xff0…

windows使用docker运行主从数据库,io线程一直在connect

1需求&#xff1a; 实现mysql数据库主从同步 分析&#xff1a;实现主从同步需要两个数据库&#xff0c;这两个数据库一般放在不同的机器上&#xff08;服务器上/个人PC上&#xff09;&#xff0c;我自己只有一个PC&#xff0c;也没有购买个人服务器&#xff0c;所以需要使用虚…

【辐射场】3D Gaussian Splatting

三维高斯…喷喷 \, 3D Gaussian Splatting&#xff0c;下文简称3DGS&#xff0c;是好一段时间以来在三维内容创作和三维重建领域比较有热度的一项技术。 它属于基于图像的三维重建方法&#xff0c;意思就是你对现实物体或者场景拍照片&#xff0c;就能给你训练成一个场景模型&a…

泛型的使用

泛型 泛型的概念 Java泛型是一种在编译时期进行类型检查和类型安全的机制&#xff0c;它可以让我们在编写代码时指定参数或返回值的类型&#xff0c;从而提高代码的可读性和可维护性。 孩童的智商可能还不足以理解泛型的具体概念和实现细节&#xff0c;但是我们可以通过类比…

unity exe程序置顶和全屏

1.置顶和无边框 设置显示位置和范围 using System; using System.Runtime.InteropServices; using UnityEngine; public class WindowMod : MonoBehaviour {public enum appStyle{FullScreen,WindowedFullScreen,Windowed,WindowedWithoutBorder}public enum zDepth{Normal…

【map】【滑动窗口】【优先队列】LeetCode480滑动窗口中位数

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 map 优先队列 题目 中位数是有序序列最中间的那个数。如果序列的长度是偶数&#xff0c;则没有最中间的数&#xff1b;此时中位数是最中间的两个数的平均数。 例如&#xf…

「品牌变革必备」品牌战略咨询公司精选策略,引领企业焕新之路

每个成功故事的背后&#xff0c;都有一个强大的品牌战略。每个成功品牌战略的背后&#xff0c;都有品牌战略咨询团队或者公司的支持。那么&#xff0c;如何找到那个能带领您的企业实现突破性成长的战略合作伙伴呢。一起来探究一下。 首先&#xff0c;我们要明确两个定义&#x…

独立站:品牌建设的新高地

一、引言 在当今的商业环境中&#xff0c;品牌建设已成为企业成功的关键因素之一。随着电子商务的迅猛发展&#xff0c;独立站已成为品牌建设的新高地&#xff0c;为企业提供了展示品牌形象、扩大知名度和美誉度的平台。本文将深入探讨独立站在品牌建设中的优势和应用&#xf…

PYTHON基础:线性算法--线性回归|岭回归|套索回归模型

常用的三种线性模型算法–线性回归模型、岭回归模型、套索回归模型 线性模型基本概念 线性模型的一般预测模型是下面这个样子的&#xff0c;一般有多个变量&#xff0c;也可以称为多个特征x1、x2、x3 … 最简单的线性模型就是一条直线直线的方程式&#xff0c;b0是截距&#…

虹科方案丨L2进阶L3,数据采集如何助力自动驾驶

来源&#xff1a;康谋自动驾驶 虹科方案丨L2进阶L3&#xff0c;数据采集如何助力自动驾驶 原文链接&#xff1a;https://mp.weixin.qq.com/s/qhWy11x_-b5VmBt86r4OdQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 12月14日&#xff0c;宝马集团宣布&#xff0c;搭载…

Flink1.17实战教程(第四篇:处理函数)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

树莓派安装Nginx搭建web服务器结合内网穿透实现无公网IP远程访问本地站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

蓝桥杯嵌入式输入捕获

1.555信号发生器原理图 2.CubeMX相关配置 3.输入捕获测频率和占空比代码