【数据结构】什么是二叉树?

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


目录

📌二叉树的定义

📌二叉树的特点

📌特殊二叉树

📌二叉树的性质

📌二叉树的存储结构

📌二叉树的遍历

前序遍历

中序遍历

后序遍历

层序遍历

结语


📌二叉树的定义

二叉树(Binary Tree)是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两颗互不相交的,分别称为根结点的左子树和右子树的二叉树组成.

 二叉树逻辑结构如下图所示:


📌二叉树的特点

二叉树的特点有:

  • 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点.注意不是只有两颗子树,而是最多有.没有子树或者有一颗子树都是可以的.
  • 左子树和右子树是有顺序的,次序不能任意颠倒.
  • 即使树中某个结点只有一棵子树,也要区分它是左子树还是右子树.下图中树1和树2是同一颗树,但它们却是不同的二叉树:

二叉树具有五种基本形态:

  1. 空二叉树.
  2. 只有一个根结点.
  3. 根结点只有左子树.
  4. 根结点只有右子树.
  5. 根结点既有左子树又有右子树.

只有三个结点的二叉树,有几种形态?

答案是有以下5种形态:


📌特殊二叉树

  • 斜树

        所有的结点都只有左子树的二叉树叫左斜树.所有结点都是只有右子树的二叉树叫右斜树.这两者统称为斜树.上图中的树2就是左斜树,树3就是右斜树.

斜树每一层只有一个结点,结点的个数与二叉树的深度相同.

  • 满二叉树

        在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树.

如下图所示,该树就是一颗满二叉树:

注意,单是每个结点都存在左右子树,不能算是满二叉树,还必须要所有的叶子都在同一层上,这就做到了整棵树的平衡.

因此,满二叉树的特点有:

  1. 叶子只能出现在最下一层.出现在其他层就不可能达成平衡.
  2. 非叶子节点的度一定是2.
  3. 在同样深度的二叉树中,满二叉树的结点个数最多,叶子数最多.
  • 完全二叉树

        对一颗具有n个结点的二叉树按层序编号,如果编号为i(1≤i≤n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这颗二叉树称为完全二叉树,如下图所示:

完全二叉树的特点有:

  1. 叶子结点只能出现在最下两层.
  2. 最下层的叶子一定集中在左部连续位置.
  3. 倒数二层,若有叶子结点,一定都在右部连续位置.
  4. 如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况.
  5. 同样结点数的二叉树,完全二叉树的深度最小.

📌二叉树的性质

性质1:

        在二叉树的第i层上至多有2^{i-1}个结点(i≥1).


推导如下:

性质2:

        深度为k的二叉树至多有2^{k}-1个结点(k≥1).


推导如下:

性质3:
        对任何一颗二叉树T,如果其终端结点数为n_{0},度为2的结点数为n_{2},则n_{0}=n_{2}+1.


终端结点数其实就是叶子节点数,一颗二叉树,只会存在度为0,度为1,度为2的结点,我们假设度为1的节点数为n_{1},则树T结点总数n=n_0+n_1+n_2.

性质4:

        具有n个结点的完全二叉树的深度为\left \lfloor log_{2}n \right \rfloor+1  , (\left \lfloor x \right \rfloor表示不大于x的最大整数).


我们由满二叉树的定义可知,深度为k的满二叉树的结点数n一定是2^k-1.因为这是最多的结点个数.那么对于n=2^k-1倒推可得满二叉树的深度数为k=log_2(n+1).

而对于完全二叉树而言,它的节点数一定少于等于同样深度数的满二叉树的结点数2^k-1,但一定多于2^{k-1}-1.即满足2^{k-1}-1< n\leqslant 2^k-1.易推导得k=\left \lfloor log_2n \right \rfloor+1.

性质5:

        如果对一颗有n个结点的完全二叉树(其深度为\left \lfloor log_2n \right \rfloor+1)的结点按层序编号(从第1层到第\left \lfloor log_2n \right \rfloor+1层,每层从左到右),对任一结点i(1≤i≤n)有:

  1. 如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点\left \lfloor \frac{i}{2} \right \rfloor.
  2. 如果2*i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2*i.
  3. 如果2*i+1>n,则结点i无右孩子;否则其右孩子是结点2*i+1.

📌二叉树的存储结构

  • 顺序存储结构

        二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系.

先来看看完全二叉树的顺序存储,一颗完全二叉树如下图:

将这颗二叉树存到数组中,相应的下标对应其同样的位置:

但如果遇到树中不存在的结点,我们也可在顺序结构中存入"^"或空,来表示该结点不存在:

这种顺序存储结构仅适用于完全二叉树.因为,在最坏的情况下,一个深度为k且只有k个结点的单支树(即树中不存在度为2的结点)却需要长度为2^{k}-1的一维数组:


  • 二叉链表

        因为二叉树每个结点最多有两个孩子,所以为它的结点设计一个数据域和两个指针域,分别指向两个孩子,我们称这样的链表叫做二叉链表.

结点结构图如下:

二叉链表结构定义代码如下:

typedef struct BiTNode
{TElemType data;         //数据域struct BiTNode*left;    //左孩子指针域struct BiTNode*right;   //右孩子指针域
}BiTNode;

📌二叉树的遍历

二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且只访问一次.

前序遍历

        前序遍历的规则是:若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,再前序遍历右子树.

如下图所示,遍历的顺序为:ABDGHCEIF


中序遍历

        中序遍历的规则是:若二叉树为空,则空操作返回,否则从根节点开始(注意不是先访问根节点)先中序遍历根节点的左子树,然后访问根节点,最后中序遍历右子树.

如下图所示,遍历的顺序为:GDHBAEICF


后序遍历

        后序遍历的规则是:若二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根节点.

如下图所示,遍历的顺序为:GHDBIEFCA


层序遍历

        层序遍历的规则是:若二叉树为空,则空操作返回,否则从树的第一层,也就是根节点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问.

如下图所示,遍历的顺序为:ABCDEFGHI


结语

希望这篇二叉树的介绍能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【数据结构】什么是树?

【数据结构】什么是线性表?

【数据结构】什么是栈?

【数据结构】用C语言实现顺序栈(附完整运行代码)

【数据结构】深入浅出理解链表中二级指针的应用

【数据结构】10道经典面试题目带你玩转链表


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

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

相关文章

【Vue3+TypeScript】快速上手_代码

目录 001_写一个APP组件 002_一个简单的效果 003_setup概述 004_setup的返回值 005_setup与Options API的关系 006_setup语法糖 007_ref创建_基本类型的响应式数据 008_reactive创建_对象类型的响应式数据 009_ref创建_对象类型的响应式数据 010_ref对比reactive 01…

(2023|CVPR,Corgi,偏移扩散,参数高斯分布,弥合差距)用于文本到图像生成的偏移扩散

Shifted Diffusion for Text-to-image Generation 公众&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 方法 2.1 偏移扩散 3. 实验 3.1 无监督文本到图像生成 3.2 无…

三相电机转差率为负值的情形

1.电机开始发电的特征 注意&#xff0c;电机因为有输入频率对原始旋转磁场的影响&#xff0c;在正常工作时&#xff0c;应该处于稳态&#xff0c;因为旋转磁场决定了这个系统的运转方向和运转的大致频率区间。它会处于力矩平衡态。但是&#xff0c;如果&#xff0c;此时电机处…

网络安全保障领域

计算机与信息系统安全---最主要领域 云计算安全 IaaS、PasS、SaaS(裸机&#xff0c;装好软件的电脑&#xff0c;装好应用的电脑) 存在风险&#xff1a;开源工具、优先访问权、管理权限、数据处、数据隔离、数据恢复、调查支持、长期发展风险 云计算安全关键技术&#xff1a;可信…

Vue-Pinina基本教程

前言 官网地址&#xff1a;Pinia | The intuitive store for Vue.js (vuejs.org) 看以下内容&#xff0c;需要有vuex的基础&#xff0c;下面很多概念会直接省略&#xff0c;比如state、actions、getters用处含义等 1、什么是Pinina Pinia 是 Vue 的存储库&#xff0c;它允许您跨…

〖Python网络爬虫实战㊹〗- JavaScript Hook 的用法

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

buuctf-Misc 题目解答分解97-99

97.[BSidesSF2019]zippy 下载完就是一个流量包 追踪tcp nc -l -p 4445 > flag.zip unzip -P supercomplexpassword flag.zip Archive: flag.zip 压缩包密码 supercomplexpassword 保存为 flag.zip 解压得到flag 98.[GUET-CTF2019]虚假的压缩包 先从虚假的压缩包入手 &am…

MySQL的事务-隔离级别

上篇&#xff0c;整理了MySQL事务的原子性&#xff0c;这篇继续整理MySQL事务的一致性、隔离性和持久性。 2. 一致性指的是事务开始前和结束后&#xff0c;数据库的完整性约束没有被破坏&#xff0c;这保证了数据的完整性和一致性。一致性必须确保数据库从一个一致的状态转换到…

C++ 比 C语言的新增的特性 1

1. C是C的增强 1.1 C是静态类型的语言&#xff0c;具有严格的数据类型检查 1.1.1 c 因为const修饰的变量不允许修改&#xff0c;但是只给了警告&#xff0c;不严谨 const int a10;a20; //报错int *p&a;*p20;//a的值&#xff1f; test1.c:6:9: warning: initialization dis…

详解Java反射机制reflect(一学就会,通俗易懂)

1.定义 #2. 获取Class对象的三种方式 sout(c1)结果为class com.itheima.d2_reflect.TestClass 获取到了Class对象就相当于获取到了该类 2.获取类的构造器 3.获取全部构造器对象 2.根据参数类型获取构造器对象 类型后必须加.class 3.构造器对象调用构造器方法 4.暴力访问 4.获…

【笔记】入门PCB设计(全30集带目录) 杜洋工作室 AD09 Altium Designer

入门PCB设计&#xff08;全30集带目录&#xff09; 杜洋工作室 AD09 p1 创建p2 原理图上增加元件1&#xff09;加元件2&#xff09;放导线3&#xff09;自定义元件1. 自定义排针2.有引脚的元件 p3 完整原理图 p1 创建 step1.创建&#xff08;PCB&#xff09;工程,后缀.PrjPCB。…

【FPGA 器件比较】Altera -- Xilinx

比较以下市场前二名的产品线及定位 应用场景XilinxAltera高性能VersalAgilex F/I性能Virtex / Kintex / Artix / Zynq UltraScaleAgilex F/I / Stratix 10中档Virtex / Kintex / Zynq ~ 7 / UltraScaleStratix 10 / Arria 10低成本Artix-7 Sparton-7Cyclone 10 如上表&#x…

Linux构建NFS远程共享存储和ftp配置

NFS架构 NFS介绍 文件系统级别共享&#xff08;是NAS存储&#xff09; --------- 已经做好了格式化&#xff0c;可以直接用。 速度慢比如&#xff1a;nfs&#xff0c;samba NFS&#xff1a;Network File System 网络文件系统&#xff0c;NFS 和其他文件系统一样,是在 Linux …

《Git快速入门》Git分支

1.master、origin、origin/master 区别 首先搞懂git分支的一些名称区别&#xff1a; master &#xff1a; Git 的默认分支名字。它并不是一个特殊分支、跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支&#xff0c;是因为 git init 命令默认创建它&#xff0c…

Redis缓存穿透、缓存击穿、缓存雪崩介绍

一、Redis的缓存穿透 1.什么是缓存穿透&#xff1f; 缓存穿透是指&#xff1a;客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这时缓存就永远不会生效&#xff0c;这些请求都打到数据库从而导致数据库压力过大。 2.出现缓存穿透的解决方案&#xff0c;以下是常用的两…

reactor的原理与实现

网络模型 前情回顾服务器模型 Reactor和 ProactorReactor模型Proactor模型同步I/O模拟Poractor模型Libevent&#xff0c;libev&#xff0c;libuv优先级事件循环线程安全 前情回顾 网络IO&#xff0c;会涉及到两个系统对象&#xff1a;   一个是用户空间调用的进程或线程   …

07 Vue3框架简介

文章目录 一、Vue3简介1. 简介2. 相关网站3. 前端技术对比4. JS前端框架5. Vue核心内容6. 使用方式 二、基础概念1. 创建一个应用2. 变量双向绑定&#xff08;v-model&#xff09;3. 条件控制&#xff08;v-if&#xff09;4. 数组遍历&#xff08;v-for&#xff09;5. 绑定事件…

leetcode 38. 外观数列(medium)(优质解法)

链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码&#xff1a; class Solution {public String countAndSay(int n) {//要进行 n - 1 次描述才能得到结果// last 代表当前要描述的字符串String last"1";// ret 代表描述…

应用安全技术措施

目录 身份鉴别 访问控制 安全审计 剩余信息保护 通信完整性 通信保密性 抗抵赖 软件容错 身份鉴别 进阶 访问控制 进阶 安全审计 进阶 剩余信息保护 进阶 通信完整性 通信保密性 抗抵赖 软件容错 ~over~

TypeScript学习(进阶篇)

一、元组 数组合并了相同类型的对象&#xff0c;而元组&#xff08;Tuple&#xff09;合并了不同类型的对象。 元组起源于函数编程语言&#xff08;如 F#&#xff09;&#xff0c;这些语言中会频繁使用元组。 简单的例子 定义一对值分别为 string 和 number 的元组&#xf…