1 绪论
4 树与二叉树
4.3 二叉树的遍历和线索二叉树
4.3.2 线索二叉树
1、定义
对于具有n个节点的二叉树,采用二叉链存储结构时,每个节点有两个指针域,总共有2n个指针域,又由于只有n-1个节点被有效指针所指向,则共有2n-(n-1)=n+1个空链域。
空的左孩子指针指向该结点的前驱;空的右孩子指针指向该结点的后继。这种附加的指针值称为线索,带线索的二叉树称为线索二叉树。
在不同的遍历次序下,二叉树中的每个结点一般有不同的前驱和后继。因此,线索二叉树又分为前序线索二叉树、中序线索二叉树和后序线索二叉树3种。
根据二叉树的特性,n个结点的二叉树,采用链式存储结构时,有n+1个空链域,可以利用这些空链域存放指向结点的直接前驱和直接后继结点的指针。为此做如下规定:当结点的左指针为空(即无左子树)时,令该指针指向按某种方式遍历二叉树时得到的该结点的前驱结点;当结点的右指针为空(即无右子树)时,令该指针指向按某种方式遍历二叉树时得到的该结点的后继结点;为了避免混淆,还需要增加两个标志位来区分指针指向的是其孩子还是前驱及后继。
问:如何判断一颗线索二叉树是否符合后续线索二叉树的定义?
解:
如图所示的一颗线索二叉树,其后序遍历为
d
b
c
a
dbca
dbca,节点d无前驱、无左子树,所以有一个指针指向Null;又因为无右子树,所以有一个指针指向其后继节点b。
节点c无左子树,故有一个指针指向前驱节点b;无右子树,故有一个指针指向后继节点a。
所以该树符合后续线索二叉树的定义。
问:先序序列为a,b,c,d的不同二叉树的个数是?
解:
根据二叉树前序遍历和中序遍历的递归算法中递归工作栈的状态变化得出:前序序列和中序序列的关系相当于以前序序列入栈次序,以中序序列为出栈次序。因为前序序列和中序序列可以唯一地确定一颗二叉树,所以问题相当于“以序列a,b,c,d为入栈次序,则出栈序列的个数为?”,对于n个不同元素进栈,出栈序列的个数为
1
n
+
1
C
2
n
n
=
14
\frac{1}{n+1}C_{2n}^{n}=14
n+11C2nn=14
4.5 树与二叉树的应用
4.5.2 平衡二叉树
为避免树的高度增长的过快,降低二叉树的性能,规定在插入和删除二叉树结点时要保证任意结点的左、右子树高度差的绝对值不超过1,这样的树被称为平衡二叉树.
平衡二叉树的插入
LL旋转(右单旋转)
RR旋转(左单旋转)
LR旋转(先左后右双旋转)
RL旋转(先右后左双旋转)
5 图
5.4 图的应用
5.4.1 最小生成树
由生成树的定义可知,无向连通图的生成树不一定是唯一的。
对于有 n n n个顶点的无向连通图,无论其生成树的形态如何,所有生成树中有且仅有 n − 1 n-1 n−1条边.
如果无向连通图是一个网,那么它的所有生成树中必有一颗边的权值之和为最小的生成树,简称为最小生成树.
常用的构造最小生成树的方法
P
r
i
m
算
法
Prim算法
Prim算法
K r u s k a l 算 法 Kruskal算法 Kruskal算法
5.4.3 拓扑排序
在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序:
- 每个顶点出现且只出现一次
- 拓扑排序是对有向无环图的顶点的一种排序,它使得若存在一条从顶点A到顶点B的路径,则在排序中顶点B出现在顶点A的后面。
6 查找
6.3 B树和B+树
6.3.1 B树及其基本操作
B树,又称多路平衡查找树,B树中所有结点的孩子结点数的最大值称为B树的阶,通常用m表示.
B树的删除
B树中的删除操作与插入操作类似,但要复杂一些,即要使得删除后的结点中的关键字个数
≥
[
m
2
]
−
1
\ge[\frac{m}{2}]-1
≥[2m]−1,因此将涉及结点的"合并"问题.
一. 当删除的关键字 k k k不在终端结点(最低层非叶结点)中时,有一下几种情况:
- 若小于 k k k的子树中关键字个数 > [ m 2 ] − 1 >[\frac{m}{2}]-1 >[2m]−1则找出 k k k的前驱值 k ′ k' k′,并用 k ′ k' k′来取代 k k k,再递归地删除 k ′ k' k′即可.
- 若大于 k k k的子树中关键字个数 > [ m 2 ] − 1 >[\frac{m}{2}]-1 >[2m]−1则找出 k k k的后继值 k ′ k' k′,并用 k ′ k' k′来取代 k k k,再递归的删除 k ′ k' k′即可.
- 若前后两个子树中的关键字个数均为 [ m 2 ] − 1 [\frac{m}{2}]-1 [2m]−1,则直接将两个子结点合并,直接删除 k k k即可.
二. 当被删除的关键字在终端结点(最底层非叶结点)中时,有下列几种情况:
- 直接删除关键字.若被删除关键字所在结点的关键字个数 > [ m 2 ] − 1 >[\frac{m}{2}]-1 >[2m]−1,表明删除该关键字后仍满足B树的定义,则直接删除该关键字.
- 兄弟够借.若被删除关键字所在结点删除前的关键字个数
=
[
m
2
]
−
1
=[\frac{m}{2}]-1
=[2m]−1,且与此节点相邻的右(左)兄弟结点的关键字个数
≥
[
m
2
]
\ge[\frac{m}{2}]
≥[2m],则需要调整该结点、右(左)兄弟结点及其双亲结点(父子换位法),以达到新的平衡,
3.兄弟不够借.若被删除关键字所在结点删除前的关键字个数 = [ m 2 ] − 1 =[\frac{m}{2}]-1 =[2m]−1且此时与该结点相邻的右(左)兄弟结点的关键字个数 = [ m 2 ] − 1 =[\frac{m}{2}]-1 =[2m]−1则将关键字删除后与右(左)兄弟结点及双亲结点中的关键字进行合并.