二叉树的认识

愚昧将使你达不到任何成果,并在失望和忧郁之中自暴自弃。                   --达芬奇
目录

🍁一.二叉树的概念

🍁二.二叉树的特点,结构 

🍁三.三种特殊的二叉树

🍁1.斜树

🍁2.满二叉树 

🍁3.完全二叉树

🍁四.二叉树的性质

🍁五.二叉树的存储方式

🍁1.顺序存储

🍁2.链式存储



参考书籍:《大话数据结构》--程杰

🍁一.二叉树的概念

二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两颗互不相交的,分别称为根结点的左子树和右子树的二叉树组成。
就像树里面用孩子兄弟表示法,表示出来的树,就是链式的二叉树。
就像下面的图,就是一颗二叉树:

🍁二.二叉树的特点,结构 

二叉树的特点:
1.
每个结点最多有两个子树,也就是一个结点的度最多为2。
2.左子树和右子树是有顺序的,次序不能颠倒。
3.某个结点只有一颗子树,也要区分它是左子树还是右子树。
就像下面这样,两个二叉树的结构是不一样的。

二叉树的五种大分类结构:
1.空二叉树
2.只有一个根节点
3.根结点只有左子树
4.根结点只有右子树
5.根结点既有左子树也有右子树

🍁三.三种特殊的二叉树

🍁1.斜树

顾名思义,斜树它一定要斜,但是不能乱斜,它还是有点讲究的。
斜树:所有的结点都只有左子树的二叉树或者所有结点都只有右子树的二叉树,两中统称为斜树。
就像下面的二叉树就是左斜树和右斜树。

这其实就很像我们之前学过的单链表,其实线性表结构就可以理解为是树的一种极其特殊的表现形式。 

🍁2.满二叉树 

满二叉树一样,顾名思义,主打突出一个满字,那要如何满的二叉树,才能称作满二叉树呢?
满二叉树:在一颗二叉树中,如果所有的分支结点都存在左子树和右子树,并且所有的叶子都在同一层上,这样的二叉树称为满二叉树。
如下图所示:

是不是非常对称,中国一向以对称为美,这样的二叉树我们也叫完美二叉树。
满二叉树的特点: 
1.
叶子结点只能出现在最后一层。
2.非叶子结点的度一定为2。
3.同样深度的二叉树,满二叉树的结点数,叶子结点数最多。
4.假设该满二叉树的高度为k,总结点数为2^k-1(使用等比数列推出来的)。第n层结点数为2^(n-1)。

🍁3.完全二叉树

完全二叉树:完全二叉树的定义是一个深度为k的有n个节点的二叉树,对树中的节点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,那么这颗树就叫完全二叉树。
完全二叉树和满二叉树的关系:完全不一定满,但满一定完全,故而完全二叉树不一定是满二叉树,而满二叉树一定是一个完全二叉树。

完全二叉树一定是和满二叉树类似的,最后一层的结点一定是连续的,如果完全二叉树的某个结点没有右子树,那么就一定没有左子树。
就如同下面的结构:
在这里插入图片描述
二叉树的特点:
1.
叶子结点只能出现在最下面的两层。
2.最下层的叶子结点一定集中在左边。
3.倒数第二层的叶子结点一定集中在右边。
4.如果结点的度为1,那么该结点只有左孩子,而没有右孩子。

🍁四.二叉树的性质

二叉树的几个性质还是比较重要的,在做一些二叉树的选择,填空题时,可能就会用到这些性质。
性质1:
1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点。
这个比较好理解,我们就用满二叉树来举例,它每一层的结点都是上一层的二倍,每一层的结点都是成等比数列增长的。

性质2: 
2.
 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h-1,我们还是以满二叉树来举例。
第一层:有1个根结点
第二层:有2个结点
第三层:有4个结点
第四层:有8个结点
依次类推,满二叉树的每一层的结点,都是以等比数列增长的,把它们的结点相加起来,其实就是等比数列求和,得到满二叉树的结点总数为2^h-1。

性质3:
对于任何一颗二叉树,如果它的叶子结点数为m,度为2的结点数为n,则m=n+2
这个结论记住就是,推导起来有点麻烦。

性质4:
具有n个结点的完全二叉树的深度为[logn]+1,([x]表示不大于x的最大值整数)。这个同样记住就是,推导起来比较麻烦。

性质5:
对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点。
2. 若2i+1>=n否则无左孩子。
3. 若2i+2>=n否则无右孩子。
这个如何理解呢?这就要说到二叉树的存储方式:顺序存储。

🍁五.二叉树的存储方式

🍁1.顺序存储

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

物理上就是实实在在在内存中如何存储的,而逻辑上的就是我们想象出来的。

知道了完全二叉树的顺序存储了之后,我们就可以来理解一些上面的性质5了。
性质5:
对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点。
2. 若2i+1>=n否则无左孩子。
3. 若2i+2>=n否则无右孩子。 

关于第一点:

双亲结点下标为i,左孩子为2*i+1,右孩子为2*i+2。 
关于性质5的2,3点。
2i+1>=n,左孩子的下标超过了数组下标的范围,那么肯定就没有左孩子了呀。
2i+2>=n,同样右孩子的下标超过了数组下标的范围,那么肯定也就没有右孩子了。

🍁2.链式存储

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

后面的二叉树的链式结构就是二叉链,比如说二叉树的前中后序遍历等等,都会用到二叉链来实现。

代码的表示:

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
 struct BinTreeNode* left; // 指向当前节点左孩子
 struct BinTreeNode* right; // 指向当前节点右孩子
 BTDataType data; // 当前节点值域
};

// 三叉链
struct BinaryTreeNode
{
 struct BinTreeNode* parent; // 指向当前节点的双亲
 struct BinTreeNode* left; // 指向当前节点左孩子
 struct BinTreeNode* right; // 指向当前节点右孩子
 BTDataType data; // 当前节点值域
};

总结:这里我们只是简单的认识了一下二叉树,知道了二叉树一些基础知识,后续才是重头戏,像堆排序,堆排序的应用,还要二叉树的链式结构,还有很多二叉树的OJ题,够我们啃好久了。
但是世上无难事,只怕有心人,为了写堆排序和堆的应用,我自己也学习了好久,没看懂的反复反复看,手写推导公式,总算是理解透彻了。
 

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

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

相关文章

redis

1. 什么是Redis?它主要用来什么的? Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提…

基于计算机视觉的手势识别技术

一个不知名大学生,江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion:2023.5.2 Last edited: 2023.5.2 手语是一种主要由听力困难或耳聋的人使用的交流方式。这种基于手势的语言可以让人们轻松地表达想法和想法&…

雷达中的无源和有源的区别

常规雷达探测目标时,需要源源不断地发射无线电波,所以叫有源雷达( active radar)。有源雷达的优点是能自主搜索目标,因为它接收的是自己发射的电磁波,所以灵敏度高,分辨率好。但这种雷达易受目标的电磁干扰&#xff0c…

C语言进阶——字符函数和字符串函数(下)

在前面我们已经学习了strlen、strcpy、strcat、strcmp几个库函数,今天我们继续学习剩余的库函数。 上期链接: C语言进阶——字符函数和字符串函数(上)_wangjiushun的博客-CSDN博客 目录: 3、长度受限制的字符串函数…

不愧是字节出来的,太厉害了...

前段时间公司缺人,也面了许多测试,一开始瞄准的就是中级水准,当然也没指望能来大牛,提供的薪资在15-20k这个范围,来面试的人有很多,但是平均水平真的让人很失望。看了简历很多上面都是写有4年工作经验&…

文件包含的本质、预处理符号、# vs ##

何为头文件? 在C语言中,文件包含是一种常见的编程技术,它允许程序员在一个源文件中使用另一个源文件中的函数或变量。 文件包含通常使用#include预处理指令来实现。#include指令告诉预处理器将文件的内容插入到当前文件的指定位置中。 例如&a…

python学习-基础知识总结

(一)基础语法 1.1、注释 程序添加注释,可以用来解释程序某些部分的作用和功能,提高程序的可读性,注释有两种形式: 单行注释:#多行注释:单引号(注释内容)或双…

笔试强训 Day6

选择题 1.十进制变量i的值为100,那么八进制的变量i的值为() A 146 B 148C 144 D 142 本题很简单:100除8,取余数,直到商为零,最后反向的串起余数即可 2.执行下面语句后的输出为(&…

【Python从入门到进阶】21、爬虫相关概念介绍

接上篇《20、HTML页面结构的介绍》 上一篇我们正式进入了Python爬虫的实战教程,主要讲解了要爬取的HTML页面的结构。本篇我们来介绍爬虫的相关概念。 一、什么是互联网爬虫 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个…

unity制作一款塔防游戏

文章目录 介绍寻路系统怪物生成器制作3种初级炮台、3种升级炮台设置炮台属性选择炮台,添加监听事件炮弹追踪攻击敌人拖动鼠标实现相机视角转换鼠标光标放在cube上变色文字动画 介绍 关键技术: 寻路系统 生成怪物算法 粒子系统 line renderer制作追踪射线…

通过Python的pdfplumber库提取pdf中表格数据

文章目录 前言一、pdfplumber库是什么?二、安装pdfplumber库三、查看pdfplumber库版本四、提取pdf中表格数据1.引入库2.定义pdf文件路径3.打开pdf文件4.获取pdf文件中的页数5.遍历每一页6.获取当前页内容7.提取表格数据8.输出表格数据9.效果 总结 前言 大家好&#…

Scala学习(九)---List集合

文章目录 1.List1.1 不可变List集合1.2 可变集合ListBuffer 1.List List集合默认为不可变集合,List集合在实例化的时候,无法通过new关键字进行实例化,只能通过伴生apply方法来对其进行实例化 1.1 不可变List集合 创建一个不可变list集合 …

HUD(抬头显示)的方案介绍

目录 一、基于DLP3030-Q1的HUD电路设计 二、DLP3030-Q1的介绍 三、DLP3030-Q1工作原理 四、DLPC120-Q1DMD 显示控制器 五、TMS320F2802332 位 MCU 六、 HUD显示实例 HUD主板实例 七、HUD的软件环境 一、基于DLP3030-Q1的HUD电路设计 本设计采用了DLP3030-Q1 芯片组&…

设计模式 -第1部分 避免浪费- 第1章 Flyweight 模式 - 共享对象避免浪费

第1部分 避免浪费 注:其内容主要来自于【日】-结城浩 著《图解设计模式》20章节 极力推荐大家阅读原著 第1章 Flyweight 模式 - 共享对象避免浪费 1.1 Flyweight 模式 Flyweight 的意思"轻量级",其在英文中的原意指比赛中选手体重最轻等级的一…

【C语言】实现猜数字游戏——随机数

🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:C语言 该篇将对 选择与循环语句 进行运用,实现猜数字游戏。 需求:游戏后可以选择再次进行游戏,也可以选择…

「实在RPA·烟草数字员工」助力烟草行业数字化转型加速度

烟草行业作为烟草产业链上重要一环,外部连接烟草工业企业、零售客户、消费者,内部包含营销、专卖、烟叶、物流等诸多业务,信息系统众多,企业数据量庞大。因此,清楚地了解自身存在的痛点,找到适合自身业务需…

如何在华为OD机试中获得满分?Java实现【寻找峰值】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

gitbook在centos上安装

1)官网下载Node.js的Linux64位的二进制包:Download | Node.js 或者在线下载: wget https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz ​​2)到指定目录​解压 cd /opt/gitbook tar -xJf node-v12.16.1-linux-x64.tar.xz mv node-…

STM32采集传感器数据通过排序取稳定值

一、前言 在物联网、单片机开发中,经常需要采集各种传感器的数据。比如:温度、湿度、MQ2、MQ3、MQ4等等传感器数据。这些数据采集过程中可能有波动,偶尔不稳定,为了得到稳定的值,我们可以对数据多次采集,进行排序,去掉最大和最小的值,然后取平均值返回。 二、排序算法…

运维工程师面试总结(含答案)

运维工程师面试总结 原文链接:https://www.cuiliangblog.cn/detail/article/2 一、linux 1. linux系统启动流程 第一步:开机自检,加载BIOS第二步:读取MBR第三步:Boot Loader grub…
最新文章