数据结构的基础认知(下)

九:树和二叉树

1:树的基础知识

(1)子树:根结点之外的其余n-1个结点被分成m(m>0)个互相不相交的集合T1、T2、···、Tm,其中每一个集合Ti(1<=i<=m)本身又是一棵树。树T1,T2,···,Tm称为根节点的子树。

(2)结点:包含一个数据元素及若干指向其他结点的分支信息的数据结构。

(3)结点的度:结点所拥有的子树的个数称为该结点的度。

(3)叶子结点:度为0的结点称为叶子结点,或者称为终端结点。

(4)分支结点:度不为0的结点称为分支结点,或者称为非终端结点。一棵树的结点除叶子结点外,其余的结点都是分支结点。

(5)孩子结点、双亲结点、兄弟结点:树中一个结点的子树的根结点称为这个结点的孩子结点,这个结点称为孩子结点的双亲结点。具有同一个双亲结点的孩子结点互称为兄弟结点。

(6)路径、路径长度:设n1,n2,···,nk为一棵树的结点序列,若结点ni是ni+i的双亲结点(1<=i <k),则把n1,n2,···,nk称为一条由n1至nk的路径。这条路径的长度是k-1。

(7)祖先、子孙:在树中,如果有一条路径从结点M到结点N,那么M就称为N的祖先,而N称为M的子孙。

(8)结点的层次:规定树的根结点的层数为1,其余结点的层数等于它的双亲结点层数加1。

(9)树的深度(高度):树中所有结点的层次的最大树称为树的深度。

(10)树的度:树中所有结点度的最大值称为该树的度。

2:二叉树

2.1分类与性质

平衡二叉树

它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

 

判断二叉树是否是平衡二叉树代码

二叉搜索树(二叉排序树)BST

它或者是一棵空树,或者是具有以下性质的二叉树

若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
它的左右子树也分别为二叉搜索树

判断二叉树是否是二叉排序树代码

 

满二叉树

在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的一棵二叉树称为满二叉树。

完全二叉树

一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(i<=n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。其特点是:叶子结点只能出现在最下层和次下层,且最下层的叶子结点在树的左部。显然,一棵满二叉树必定是一棵完全二叉树

二叉树的性质:

对任何一颗二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1

具有n个节点的完全二叉树的深度为(log2n)取下限+1

在二叉树的第 i 层上至多有2i-1个节点

在深度为 k 的二叉树至多有2k-1个节点

2.2:二叉树的遍历

先序遍历

递归:先打印根节点,再打印左孩子,再打印右孩子

非递归:首先根节点入栈,依次从栈顶取出节点,如果该节点不为空访问该节点,同时把该节点右子树入栈,然后左子树入栈

中序遍历

递归:先打印左孩子,再打印根节点,再打印右孩子

非递归:先将根及左孩子节点依次入栈,依次取出栈顶元素并访问`……

后序遍历

递归:先打印左孩子,再打印右孩子,再打印根节点

非递归:根节点入及左孩子节点依次入栈,依次取出栈顶元素p访问……

层次遍历

例1:根据两个求一个:

例2:计算二叉树平均查找长度

查找成功

查找不成功

 

 

3:树与森林

3.1树的存储

(1)双亲表示法

树中除根结点外的每个结点都有唯一的一个双亲结点,根据这一特性,可用一组连续的存储空间即一维数组存储树中的各个结点,数组中的一个元素表示树中的一个结点,数组元素为结构体类型,其中包括结点本身的信息及结构体类型,其中包括结点本身的信息及该结点的双亲结点在数组中的序号,树的这种存储方法称为双亲表示法。

 

 (2)孩子表示法

 

 (3)孩子兄弟表示法

在树中,每个结点除其信息域外,再增加两个分别指向该结点的第一个孩子结点和右兄弟结点的指针。在这种存储结构下,树中结点的存储结构可描述如下:

 

 3.2森林与二叉树的相互转换

(1)树转换为二叉树

  • 树中所有相邻兄弟之间加一条连线;
  • 对树中每个结点,只保留它与第一个孩子结点之间的连线,删去它与其他孩子结点之间的连线;
  • 以树的根结点为轴心,将整棵树顺时针转动一定的角度,使之结构层次分明。

 

 一棵树采用孩子兄弟表示法所建立的存储结构与它所对应的二叉树的二叉链表存储结构是完全相同的。

(2)森林转换为二叉树

  1. 将森林中的每棵树转换成相应的二叉树;
  2. 第一棵二叉树不动,从第二课二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,当所有二叉树连起来后,所得到的二叉树就是由森林转换得到的二叉树。

(3)二叉树还原为树和森林

  1. 若某结点是某双亲的左孩子,则把该结点的右孩子、右孩子的右孩子·····都与该结点的双亲结点用线连起来;
  2. 删去原二叉树中所有的双亲结点与右孩子结点的连线;
  3. 整理由前面两步所得到的树或森林,使之结构层次分明。

3.3树和森林的遍历

 

 

 

4:最优二叉树——哈夫曼树

是指对于一组带有确定权值的叶子结点,构造的具有最小带权路径长度的二叉树。

二叉树的路径长度则是指由根节点到所有叶子结点的路径长度之和。

从根结点到各个叶子结点的路径长度与该叶子结点相应的权值的乘积之和叫做二叉树的带权路径长度(Weighted Path Length,简称WPL = 路径长度X权值)。

哈夫曼树

(在哈夫曼树中没有度为1的结点,只有度为0(叶子结点)和度为2的结点)

构造哈夫曼树:在森林中选取两棵根节点的权值最小的树作为左右子树构造一棵新的二叉树,新二叉树的根节点权值为左右子树节点的权值之和,依次重复该步骤直到只含一棵树为止

哈夫曼编码:

 

5:B树与B+树

5.1B树

B树可以看做2-3树,对于M阶B树,他有如下要求

1、根结点至少有两个子女;

2、每个非根节点所包含的关键字个数 j 满足:┌m/2┐ - 1 <= j <= m - 1;

3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:┌m/2┐ <= k <= m ;

4、所有的叶子结点都位于同一层。

5.2B+树

对于M阶B+树,他有如下要求

1.有n棵子树的结点中含有n个关键字,每个关键字不保存数据,只用来索引,所有数据都保存在叶子节点。

2.所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.所有的非终端结点可以看成是索引部分,结点中仅含其子树(根结点)中的最大(或最小)关键字。

六:图

1:基本定义

图(Graph)是由非空的顶点集合和一个描述顶点之间的关系——边(或者弧)的集合组成的,其形式化定义为:G=(V,E)、V是图G中顶点的集合,E是图G中边的集合

1、无向图:在一个图中,如果任意两个顶点构成的偶对(vi,vj)包含E是无序的,即顶点之间的连线是没有方向的,则称该图为无向图。

2、有向图:在一个图中,如果任意两个顶点构成的偶对<vj,vj>包含E是有序的(有序对常常用尖括号“<>”表示),即顶点之间的连线是有方向的,则称该图为有向图。

4、无向完全图:在一个无向图中,如果任意两顶点都有一条直接边相连接,则称该图为无向完全图。可以证明,在一个含有n个顶点的无向完全图中,有n(n-1)/2条边。

5、有向完全图:在有一个有向图中,如果任意两顶点之间都有方向互为相反的两条弧相连接,则称该图为有向完全图。在一个含有n个顶点的有向完全图中,有n(n-1)条边。

6、顶点的度、入度、出度:顶点的度(Degree)是指依附于某顶点v的边数,通常记为TD(v)。顶点v的入度是指以顶点v为终点的弧的数目,记为ID(V);出度是指以顶点v为始点的弧的数目,记为OD(V)。有TD(V)=ID(v)+OD(v)。

8、路径、路径长度:顶点vp到顶点vq之间的路径(path)是指顶点序列vp、vi1、vi2、···、vim、vq。其中,(vp,vi1)、(vi1,vi2)、···、(vim,vq)分别为图中的边。路径上边的数目称为路径长度。

9、简单路径、回路、简单回路:

序列中顶点不重复出现的路径称为简单路径。

路径中第一个顶点与最后一个顶点相同的 路径称为回路或环(Cycle)。

除第一个顶点与最后一个顶点之外,其他顶点不重复出现的回路称为简单回路,或者简单环。

10、子图:对于图G=(V,E),G'=(V',E'),若存在 V'是V的子集, E'是E的子集,则称图 G'是G的的一个子图。

11、连通、连通图、连通分量:

在无向图中,如果从一个顶点vi到另一个顶点vj(i=!j)存在路径,则称顶点vi和vj是连通的。

如果图中任意两个顶点都是连通的,则称该图是连通图

无向图的极大连通子图称为连通分量,极大连通子图是指在保证连通与子图的条件下,包含原图中所有的顶点与边。 

 

12、强连通图、强连通分量:

对于有向图来说,若图中任意一对顶点vi和vj(i=!j)均存在从一个顶点vi到另一个顶点vj和从vj到vi的路径,则称该有向图是强连通图

有向图的极大强连通子图称为强连通分量,极大强连通子图的含义同上。

13、生成树:所谓连通图G的生成树,是G的包含其全部n个顶点的一个极小连通子图,所谓极小连通子图是指在包含所有顶点且保证连通的前提下尽可能少地包含原图中的边。生成树必定包含且仅包含连通图G的n-1条边。在生成树中添加任意一条属于原图中的边必定会产生回路,因为新添加的边使其所依附的两个顶点之间有了第二条路径。若生成树中减少任意一条边,则必然成为非连通

 

2关键活动与关键路径的计算

事件(顶点)VR 的最早发生事件Ve(k)(保证前提已经全部发生,即开始顶点到Vk的最长路径长)

事件(顶点)VR的最迟发生时间Vl(k)(不耽误后续时间发生的最迟时间,从后往前)

活动ai(边)的最早开始时间e(i):该活动的起点事件的Ve(k)

活动ai(边)的最迟开始时间l(i):该活动终点所表示的事件最迟发生时间与该活动所需时间之差

l(i) = Vl(j)- weight<Vk,Vj>

关键路径:L(i) = e(i)的路径

 

 

2:存储结构

2.1邻接矩阵

用二维数组存储图中的顶点信息,用矩阵表示图中各顶点的信息,用矩阵表示图中各顶点的信息,用矩阵表示图中各顶点之间的邻接关系。

对于有向图,邻接矩阵的第i行货第i列非零元素或非&元素的个数正好是第i个顶点的出度OD(vi)或如度ID(vi)。

 

 2.2邻接表

在邻接表上容易找到任意顶点的第一个邻接点和下一个邻结点,但要判定任意两个顶点(vi和vj)之间是否有边或弧相连,则需查找第i个或第j个链表,因此,不如邻接矩阵方便。

 

3:图的遍历

深度优先搜索

广度优先搜索

4:图的应用

最小生成树:prim算法和Kruskal算法

最短路径:迪杰斯特拉和弗洛伊德

AOV—网:表示有执行的先后顺序的网,不会出现有向环,对于给定AOV—网应该判定网中是否有环路存在,判定方法为——拓扑排序

 拓扑排序:(1)在网中选一个无前驱的顶点且输出它  (2)从图中删除该顶点和所有以它为尾的弧 (3)重复上两步,直到不存在无前驱的顶点

    AOE—网:(关键路径)在AOV—网的基础上,弧上加上权值,表示活动所需时间,在有些活动开始的时候,另一些活动也可以同时进行,这样就不耽误整体的进度,要估算整体进度,就要找                                     一条从源点到汇点(终点)的带权路径长度最长的路径,称为关键路径,关键路径上的活动叫做关键活动

七:查找

折半查找

查找成功时的平均查找长度

构建折半查找判定树

 

 

 

ASL成功=求和[}(圆圈*路径长)]  /  圆圈数

ASL失败= 求和【(方框*路经长)】/ 方框数

 

哈希查找的平均查找长度

构建哈希表

ASL成功=求和【成功节点查找次数】/ mod数

ASL失败=求和【不存在节点查找次数(即mod数中映射的空余数查找次数)】/ mod数

线性探测法:

链地址法:

 

八:排序

内部排序

外部排序

排序算法理论专题:

 

posted @ 2018-08-31 14:04  阿苍老师  阅读(173)  评论(0编辑  收藏  举报