数据结构——二叉树四种遍历的实现-2

简介: 数据结构——二叉树四种遍历的实现

数据结构——二叉树四种遍历的实现-1

https://developer.aliyun.com/article/1507984


2、特殊二叉树

1)斜树

 所有结点都只有左子树的二叉树被称为左斜树。

c2280595008eff93612955a4d609a450_072575bc47b84d1e80259184d025eacf.png

 所有结点都只有右子树的二叉树被称为右斜树。

cc158a93c8586171a08c4db6ce0007a7_2041d571903d46998187eb1e465a42ad.png

 斜树有点类似线性表,所以线性表可以理解为一种特殊形式的树。


2)满二叉树

 对于一棵二叉树,如果它的所有根结点和内部结点都存在左右子树,且所有叶子结点都在同一层,这样的树就是满二叉树。

ea8cfb8ccdb9cc6028b40807a7ff2c11_1c6f770463064ad3b05b291563f4565c.png

 满二叉树有如下几个特点:

   1)叶子结点一定在最后一层;

   2)非叶子结点的度为 2;

   3)深度相同的二叉树,满二叉树的结点个数最多,为 (其中 h 代表深度)。


2)完全二叉树

 对一棵具有 n 个结点的二叉树按照层序进行编号,如果编号 i 的结点和同样深度的满二叉树中的编号 i 的结点在二叉树中位置完全相同,则被称为 完全二叉树。

674c6515ef15aaa05be18e2aa7f0128e_192b9c94875d46739aad70d9a2f8b361.png

 满二叉树一定是完全二叉树,而完全二叉树则不一定是满二叉树。

 完全二叉树有如下几个特点:

   1)叶子结点只能出现在最下面两层。

   2)最下层的叶子结点一定是集中在左边的连续位置;倒数第二层如果有叶子结点,一定集中在右边的连续位置。

   3)如果某个结点度为 1,则只有左子树,即 不存在只有右子树 的情况。

   4)同样结点数的二叉树,完全二叉树的深度最小。


 如下图所示,就不是一棵完全二叉树,因为 5 号结点没有右子树,但是 6 号结点是有左子树的,不满足上述第 2 点。

455d1e6e55f0fa73cd741b8e440edee8_7f97c38f8ed141f0ab6782c19c114e7f.png

3、二叉树的性质

 接下来我们来看下,二叉树有哪些重要的性质。


1)性质1

 【性质1】二叉树的第 i(i≥1) 层上至多有 5259216fa29f9fccba532ac14862e2d2_c92ec3a5b54144a69f0c1a1848f4933a.png 个结点。


 既然是至多,就只需要考虑满二叉树的情况,对于满二叉树而言,当前层的结点数是上一层的两倍,第一层的结点数为 1,所以第 i 的结点数可以通过等比数列公式计算出来,为 。


2)性质2

 【性质2】深度为 h 的二叉树至多有 9948936ed7ab6fc3d3ecf43022565b84_b72fd5255c4343e88a00b1999688e09e.png 结点。


 对于任意一个深度为 h 的二叉树,满二叉树的结点数一定是最多的,所以我们可以拿满二叉树进行计算,它的每一层的结点数为 image.png

 利用等比数列求和公式,得到总的结点数为: image.png


3)性质3

 【性质3】对于任意一棵二叉树 T,如果叶子结点数为 x0,度为 2 的结点数为 x2,则


x0=x2+1

e79d27e8c426671d3d93ec62de20cf86_6be3fcd524d14367b224a73ea9246e90.png


 令 x1 代表度 为 1 的结点数,总的结点数为 n,则有:

n=x0+x1+x2

 任意一个结点到它孩子结点的连线我们称为这棵树的一条边,对于任意一个非空树而言,边数等于结点数减一,令边数为 e,则有:

e=n−1


对于度为 1 的结点,可以提供 1 条边,如图中的黄色结点;对于度为 2 的结点,可以提供 2 条边,如图中的红色结点。所以边数又可以通过度为 1 和 2 的结点数计算得出:


                               e=x1+2x2 


联立上述三个等式,得到:


                               e=n−1=x0+x1+x2−1=x1+2x2  


化简后,得证:

                               x0=x2+1


4)性质4

 【性质4】具有 n 个结点的完全二叉树的深度为 [log2n]+1。


 由【性质2】可得,深度为 ℎh 的二叉树至多有 d86a458bb29cf8f9a910481f34faa86f_97bedb1f8f764835832b53c524d0464c.png 个结点。所以,假设一棵树的深度为 h,它的结点数为 n,则必然满足:

997ce8802a7133895ba29af2a2cfc7c2_ed13a5298d97415eb28c005782f2cdb2.png


由于是完全二叉树,它一定比深度为 ℎ−1h−1 的结点数要多,即:

96bec0e8d138831f7d0a1d4cea8de296_33f9c92c5a964e4185999e3c07e17270.png


将上述两个不等式,稍加整理,得到:

0ae8b8220d23d9d8f329017ba0f634aa_6065a6abc2bd43b5ae6cfdabd56e6a3e.png


然后,对不等式两边取以2为底的对数,得到: 

d4751c8bb4862a255130547d4d556fc3_97fd23b065dc441c99293d88d44dae70.png

这里,由于 h 一定是整数,所以有:


26d4af73242fb0aca5795a11248adb0e_c4a695a4f568435f810cfc8689223e10.png


三、二叉树的存储和创建

1、顺序表存储

 二叉树的顺序存储就是指利用数组对二叉树进行存储。结点的存储位置即数组下标,能够体现结点之间的逻辑关系,比如父结点和孩子结点之间的关系,左右兄弟结点之间的关系 等等。


1)完全二叉树

 来看一棵完全二叉树,我们对它进行如下存储。

1153af1704ae7bd2c061295b87daa067_c114d72d11c646258b7a9efeb23191a8.png

 编号代表了数组下标的绝对位置,映射后如下:

image.png


image.png

2)非完全二叉树

 对于非完全二叉树,只需要将对应不存在的结点设置为空即可。

f0ddd081a1b3bf028be6d332fb846ef8_68347ed91d854d9ca6b7dadb812a34a3.png

 编号代表了数组下标的绝对位置,映射后如下:


下标 0 1 2 3 4 5 6 7 8 9 10 11 12
data a b c d e f g k l

3)稀疏二叉树

 对于较为稀疏的二叉树,就会有如下情况出现,这时候如果用这种方式进行存储,就比较浪费内存了。

0bb34d8d2231601d0134353c28920a53_b664cfa6a7ec48d8b265315088491fbb.png

 编号代表了数组下标的绝对位置,映射后如下:

下标 0 1 2 3 4 5 6 7 8 9 10 11 12
data a b c d g h
于是,我们可以采取链表进行存储。

 

2、链表存储

 二叉树每个结点至多有两个孩子结点,所以对于每个结点,设置一个 数据域 和 两个 指针域 即可,指针域 分别指向 左孩子结点 和 右孩子结点。

typedef char datatype_bt;
typedef struct btreenode{
  datatype_bt data;
  struct btreenode *lchild;  // 指向左孩子节点
    struct btreenode *rchild;   // 指向右孩子节点
}btree_node,*btree_pnode;


数据结构——二叉树四种遍历的实现-3

https://developer.aliyun.com/article/1507986

相关文章
|
20天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
71 8
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
24 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
26 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
1月前
|
Java
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
28 1
|
1月前
|
算法 Java C语言
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
25 1
|
1月前
|
存储
【数据结构】二叉树链式结构——感受递归的暴力美学
【数据结构】二叉树链式结构——感受递归的暴力美学
|
1月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
1月前
|
存储 算法 调度
数据结构--二叉树的顺序实现(堆实现)
数据结构--二叉树的顺序实现(堆实现)
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(三)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(二)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解