认识了树,再来看看二叉树吧

简介: 认识了树,再来看看二叉树吧

前言:

上一期给大家讲了树的基本概念和特点,现在可以试着回忆一下树的样子,还有一些关系称谓。那么今天要讲的,是二叉树,是一种特殊且实用的树,是不是有些小期待呢!


目录

🐷1.什么是二叉树

1.1二叉树的结构

1.2满二叉树

1.3完全二叉树

1.4二叉树的性质

🐽2.二叉树的存储结构

2.1顺序存储

2.2链式存储



1.什么是二叉树


1.1二叉树的结构


先来回顾下树:倒置的,根在顶端,向下分岔... ...

所谓二叉树,二叉嘛,就是有两个叉子呗:

ef2a348e15c19b318aa31356ca8c31dd_c58fc428a05c49afa6e1ac5685b91b16.png

                 一颗简单的二叉树

还真是,简单说,它就是每个结点最多能分两个叉的树。

一棵二叉树是结点的一个有限集合:

• 或者为空

• 由一个根节点加上两棵别称为左子树右子树的二叉树组成

858ff3ee25bdf8767dfbaf8e0897dc98_5f2e2d1bbf99492c9270c68c052bda0e.png

二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

那么二叉树是不是只有二叉的情况呢?

其实并不是,下面总结二叉树的几种单元形态:

c85b023b92c84dbb4e8fccc6ef1bae77_5a336aebac9f4247ab1f22bdb0203cd9.png

任意一种二叉树都可以由上面的形态复合而成。


1.2满二叉树


这是一种特殊的二叉树

满,意味着除根节点以外的结点都拥有左右结点(子树),即每一层的结点数达到最大值。

84426b8b065a87df8217075c5a2d6c61_b2a8af8895894ce8b273dfda8bafd68c.png

例:满二叉树

非常完美的二叉树~

如果设它的高度为K,那么它共有2^K-1个结点,同样可以用这条性质来判断是否为满二叉树


1.3完全二叉树


这种树相比满二叉树就有些空缺了,

但是空的结点也有讲究:

从二叉树末端(右下角)开始,空到这一层的任意位置,保证空结点不间断

换句话说,最后一层的结点都仅靠左部。

ffc3964584616eabedcec7cf6ceac190_d8f1467d7df542649af193af5516c55d.png

 例:完全二叉树

它的准确的定义是:

对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1n的结点

要注意:满二叉树是一种特殊的完全二叉树,完全二叉树的范围更广一些。


1.4二叉树的性质


• 若规定根节点的层数为1,则一棵非空二叉树的i层上最多有 2^(i-1) 个结点。

0d42ef344a5e00ef67f80ac01232522b_adb9709491c743db9ab1f4be9dff7f07.png

最多就是满的情况,层的编号与每层最多结点的个数关系:Ni = 2^(i-1);

可以联想一下有丝分裂... ...

• 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h-1

这里就是一个等比数列求和,

在完全二叉树的情况下,第一层到第h层的结点个数:

2^0,2^1,2^2,2^3,... ... 2^(h-1)

求和:

Nh = 2^0+2^1+2^2+2^3+...+2^(h-1)

通过错位相减求和得到结点总数:

Nh = 2^h-1

•  对任何一棵二叉树,如果度为0其叶结点个数为n0 , 度为2的分支结点个数为n2 ,则有

n0 = n2+1

这个可以简单找找规律:

530c60d34f328a5758c6ebdf4b50b6d1_73bf28a2b5c5402a8d20779bb7077484.png

可以发现叶子结点的个数总比度为2的结点个数多1

• 若规定根节点的层数为1,具有n个结点的满二叉树的深度h = log2(n+1) 

【log2(n+1)是以2为底,n+1的对数】

其实就是按之前求最大个数的式子 Nh = 2^h-1 把h表示出来,一个意思

• 对于具有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 否则无右孩子

可以看看这个标记:

f729ff58b12230ae1b98d23d2ba3c797_aa2d7047beb84147bbaece47ba5a147e.png


2.二叉树的存储结构


2.1顺序存储


所谓顺序存储,就是以数组来实现二叉树。

欸?用数组来实现二叉树,

其实这个跨度还蛮大的,心里想的是链型的,实际实现却是用数组这种顺序结构。

这里用 逻辑结构 物理结构 来分别表示:

32ae24300449a294d06cea5995f54068_c60302e4f0d2488ba09b04b2e0d357e7.png

逻辑结构就是心里想的,物理结构就是实际实现需要的

这种存储结构适用于满二叉树,因为满二叉树不会有数组空间的浪费。


顺序存储中有一个典型的数据结构叫做堆(一种二叉树,此堆非彼堆,彼堆是操作系统中管理内存的一块区域分段),这里放到下期讲解。


2.2链式存储


这个链式存储就是正常的思路了:

typedef int BTDataType;
typedef struct BinaryTreeNode
{
  BTDataType data;
  struct BinaryTreeNode* left;
  struct BinaryTreeNode* right;
}BTNode;

这里定义一棵二叉树树的基本结构:

要存储的数据,指向左子树的指针,指向右子树的指针。

所以根据左右孩子的关系就可以创建一颗二叉树:

34a048d4a39cdfd3d0a1ce80615c05ba_da9fe88a2e0f495d910b73a9a93d9de9.png

根据左右孩子关系创建的一颗简单二叉树

链式结构方便在遍历,后期会讲解二叉树的遍历。


总结:

这篇博客给大家介绍了二叉树,更加偏向理论层面,那么下期就会带大家敲代码实现一些特殊的二叉树:堆,二叉树的遍历等等。

目录
相关文章
|
9月前
|
消息中间件
消息的重复消费问题如何解决
在使用RabbitMQ进行消息收发的时候, 如果发送失败或者消费失败会自动进行重试, 那么就有可能会导致消息的重复消费 , 具体的解决方案其实非常简单, 为每条消息设置一个唯一的标识id , 将已经消费的消息记录保存起来 , 后期再进行消费的时候判断是否已经消费过即可 , 如果已经消费过则不消费 , 如果没有消费过则正常消费
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习的原理与应用:开启智能时代的大门
深度学习的原理与应用:开启智能时代的大门
730 16
|
10月前
|
人工智能 小程序 程序员
【视频测评 DEMO 参考】VSCode 神级 AI 插件通义灵码:完全免费+实战教程+微信贪吃蛇小程序
VSCode 神级 AI 插件通义灵码:完全免费+实战教程+微信贪吃蛇小程序
779 8
|
机器学习/深度学习 人工智能 自然语言处理
Transformer图解
Transformer 是一种在自然语言处理(NLP)领域广泛使用的模型架构该模型通过Self-Attention机制和位置编码技术替代传统的RNN结构,实现了并行处理和更有效的长距离依赖捕捉。Transformer主要由编码器(Encoder)和解码器(Decoder)两部分组成,其中编码器负责处理输入序列,解码器则基于编码器的输出生成目标序列。每一层的编码器和解码器内部均采用多头注意力机制(Multi-Head Attention)、前馈神经网络以及残差连接和归一化层,以增强模型的学习能力和稳定性。此外,位置编码的引入使得模型能够在处理无序的输入序列时保留词语的位置信息。
559 13
|
NoSQL Java MongoDB
MongoDB Limit 与 Skip 方法
10月更文挑战第16天
186 3
|
Windows
github图床链接打开提示raw.githubusercontent.com无法访问解决
github图床链接打开提示raw.githubusercontent.com无法访问解决
383 0
|
监控 关系型数据库 MySQL
实时计算 Flink版产品使用合集之如何在route中将多张表弄成宽表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
Python
Polars实践(3):阿里天池——淘宝用户购物行为分析
Polars实践(3):阿里天池——淘宝用户购物行为分析
242 0
|
SQL 关系型数据库 数据库
Python执行PostgreSQL数据库查询语句,并打印查询结果
本文介绍了如何使用Python连接和查询PostgreSQL数据库。首先,确保安装了`psycopg2`库,然后创建数据库连接函数。接着,展示如何编写SQL查询并执行,例如从`employees`表中选取所有记录。此外,还讨论了处理查询结果、格式化输出和异常处理的方法。最后,提到了参数化查询和事务处理以增强安全性及确保数据一致性。
Python执行PostgreSQL数据库查询语句,并打印查询结果
|
机器学习/深度学习 人工智能 算法
【机器学习】大模型训练的深入探讨——Fine-tuning技术阐述与Dify平台介绍
【机器学习】大模型训练的深入探讨——Fine-tuning技术阐述与Dify平台介绍