数据结构期末复习(1)树

目录

 

求叶子结点的个数

 

二叉树的存储

 

二叉树的遍历

1、广度优先遍历(层次遍历)vs 深度优先遍历

2、先序 vs 中序 vs 后序遍历(属于深度优先遍历)

  2.1 由中序+先序/后序推出二叉树

  2.2 由二叉树推出先序/中序/后序遍历的顺序

3、二叉树的递归遍历 vs 非递归遍历 ?

https://blog.csdn.net/qq_23009153/article/details/78269520

 

 

将树转换为二叉树

 

 

特殊的二叉树类型:

哈夫曼树/最优二叉树

满二叉树vs完全二叉树

二叉排序树/二叉搜索树/二叉查找树

线索二叉树

最小生成树

 

 

 


 

求叶子结点的个数

一定要记住的两条公式:

①N=n0+n1+n2+...

②N=0*n0+1*n1+2*n2+...+1

 

(其中,N为结点数总数;n0为度为0的结点数,即叶子结点;n1位度为1的结点数,以此类推...)

 

eg.

 

 

【补充】

度:节点所拥有的子树的数目称为该节点的度

 

 


 

二叉树的遍历

 

带权无向图G(顶点分别为V1,V2,V3,V4,V5,V6)的邻接矩阵是A

 

要求: (1)画出图G

 

 

注意:无向图的邻接矩阵是对称的,因此如果要根据邻接矩阵画图,可以直接只看上三角或下三角(不然很浪费时间)

 

 

(2)分别写出从V1出发的深度优先遍历序列和广度优先遍历序列。

深度:1,2,3,4,6,5

广度:1,2,5,6,3,4

 

解释:

(1)求深度

设从结点v1出发,一直沿着所连的路走下去即可:v1→v2→v3→v4→v6→v5

 

*假设图中v2除了与v1相连外,不再与图中其他结点相连怎么办?

A:直接从v2返回到v1,再从v1开始对其他结点的遍历(v2只要能遍历到就可以了)

 

 

(2)求广度

求广度遍历的次序,实质上是看一个结点与哪些结点相连。

设从结点v1出发  →  相当于先访问了v1,

v1与v2、v5、v6相连  →  于是在访问v1后,会先遍历到v2、v5、v6

然后看v2、v5、v6分别与哪些结点直接相连:

v2:与v1,v3,v6相连,其中v3还没有被访问过  →  遍历v3

v5:与v1,v6相连,都被访问过了

v6:与v1,v4,v5相连,其中v4还没有被访问过  →  遍历v4

 

最终的广度优先遍历次序:v1 v2 v5 v6 v3 v4

 

 

 

 

 


 

哈夫曼树 / 最优二叉树

【哈夫曼树的构造】——权值从小到大排序,两两组合权值最小值,直到组成一棵二叉树

https://blog.csdn.net/yushupan/article/details/82735773

 

【求哈夫曼树的带权路径】——权值W = 各叶子结点权值*距离根节点的距离 之和(需要计算的权值点不包括中途生成的权值之和,即所有的父节点)

https://www.jianshu.com/p/35cf51516fe5

 

哈夫曼树的结点数关系:

  由于哈夫曼树中没有度为1的结点。 只有度为0和度为2的结点。(树中的度:表示有几个孩子)

  则一棵有n个叶子结点的哈夫曼树共有2n-1个结点。

 

 

 

eg.以数据集{4,5,6,7,10,12,18}为叶结点权值所构造的哈夫曼树,其带权路径长度为(165 )。

 A:


带权路径长度:(4+5)*4+(6+7)*3+10*3+12*2+18*2=165

(再次强调——带权路径长度:只算叶子结点!)

 

 

 

哈夫曼编码

描述的是到达哈夫曼树中的一个元素所需要走的路径。其中,0表示向树的左儿子方向移动,1表示向树的右儿子方向移动。

eg.

 

 哈夫曼树如下图所示:

各个电文对应的频文就是哈夫曼树中需要找的结点

A:17

分析过程:

从100开始左行到60→0

从60开始左行到28→0

从28开始右行到17→1

所以A的哈夫曼编码为:001

 

其余频文同理。

 

 

eg.

 

(下面这个解释我也不太确定对不对,感觉如此?)

↑特别注意:

哈夫曼树中得到的结点权值之和不能和其他的结点(即不是权值之和的结点)再次组合成权值之和

具体到本题来说:本题中5和10得到15,而本来权值中也有15,这怎么办呢?

 

5和10得到的15属于权值之和,这个权值之和应该与另一个权值之和组合

而原来权值中就有的15要与12组合

 

 

 

 


 

二叉树的存储结构

(1)顺序存储

(2)链表存储

 

一棵有n个结点的二叉树,除了根结点之外,其余每个结点均有一个出自其双亲的指针域的指向该结点的指针,

因此,共有n-1个指针域非空

指针域的总数目为2n,所以恰好有n+1个空指针域

 

 


 

 

满二叉树&完全二叉树

满二叉树是特殊的二叉树

 

 

 


 

二叉树的遍历

前序遍历

中序遍历

后序遍历

(补充mooc图)

 

//仅提供前序和后续遍历的序列是不能反推出二叉树的

 

 

(未完待续)

 


二叉排序树

 

 二叉排序树的构建步骤:

将关键字集合中的第一个作为整个二叉排序树的根节点

取第2个关键字,如果它比根节点大,则作为根节点的右孩子;如果比根节点小,就作为根节点的左孩子;

……(后序步骤同上)

 

 


 

 

(图的)最小生成树

 

相关知识点:Prim算法、Kruskal算法

此部分请看↓

https://www.cnblogs.com/HelenBlog/p/13111671.html

 

留一道例题:

 

 


 

将树转化为二叉树

(1)加线。在所有兄弟结点之间加一条连线。

(2)去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。

(3)层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。

(注意:第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子

(注意:如果有结点只有一个孩子结点,则在转化为二叉树时,这个孩子结点将变为此节点的左孩子结点

 

 

 

将森林转化为二叉树

(1)把每棵树转换为二叉树。

(2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。

 

 

 

eg.

把下列森林转换为二叉树(写出过程)

 

 

 

A:

 

 

 

 

 

二叉树转换为森林(感觉这个考的较少)

假如一棵二叉树的根节点有右孩子,则这棵二叉树能够转换为森林,否则将转换为一棵树。

(1)从根节点开始,若右孩子存在,则把与右孩子结点的连线删除。再查看分离后的二叉树,若其根节点的右孩子存在,则连线删除…。直到所有这些根节点与右孩子的连线都删除为止。

(2)将每棵分离后的二叉树转换为树。

 

(见图:将同时有左右孩子的结点的右孩子结点的连线删去,再直接将孩子结点们(兄弟)相连,就可以将森林转化为树)

 

 

 


 

最小生成树

一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。(n个结点,n-1条边)

具体请看期末复习笔记(2)图:https://www.cnblogs.com/HelenBlog/p/13111671.html

(涉及Prim算法和Kruskal算法)

 


 

 

二叉排序树(二叉查找树、二叉搜索树)BST

二叉查找树:

根节点的值大于其左子树中任意一个节点的值,小于其右节点中任意一节点的值,这一规则适用于二叉查找树中的每一个节点。

(或者是一棵空树)

 

参考:https://blog.csdn.net/rodman177/article/details/89771156

 

二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势

 

二叉搜索树能够高效地进行如下操作:

1.插入一个数值

2.查询是否包含某个数值

3.删除某个数值

 

不论哪一种操作,所花的时间都和树的高度成正比。因此,如果共有n个元素,那么平均每次操作需要O(logn)的时间。

 

 


 

平衡二叉树(AVL树)

平衡二叉树也是一种搜索树。

(即左子树比根节点小,右子树比根节点大)

 

 

 

 

 

 

 

 (总结点数=左儿子结点数+右儿子结点数+1)

 

 

将二叉树调整为平衡二叉树:

https://www.bilibili.com/video/BV1JW411i731?p=44

 


 

线索二叉树

 http://data.biancheng.net/view/28.html

posted @ 2020-06-13 00:07  海伦甜心日记  阅读(102)  评论(0)    收藏  举报