备战期末——数据结构非程序题

158 阅读4分钟

引言

本文围绕老师给出的题型进行讲解。

正文

1)对给定的图或网(加权图),会用邻接矩阵、邻接表进行表示。

邻接矩阵和邻接表都是图的存储结构,加权图也叫做网。

对于无向图和有向图的邻接矩阵见下, (相连的是1,不相连的是0)

无向图的邻接表见下(并不唯一):

对于邻接表有两种节点:

对于无权图不会使用info,所以可以看做只有一种节点(即头结点),但是对于有权图则不再一样,见图:

到这里,基本上只有一个带权图的邻接矩阵不知道怎么表示了,下面继续讲解。

以下图为例:

得到的邻接矩阵是:

可以看到,矩阵中全是权值,点到自身的权值是0,到没有关联的点的权值是∞。

2)对给定的网(加权图),求出最小生成树(两种算法都要掌握)、求出最短路径(Dijkstra算法)。

求最小生成树有两种算法——普里姆(Prim)和克鲁斯卡尔(Kruskal)算法。
普里姆算法会首先给定一个点,我们以下图为例讲解:

在图中,我们知道了起点0,然后先只看0的两边,可以看到10和15,选择小的(即10),然后就可以连接0和5;这时候再把0和5看做统一体,看两边,可以看到25和28,所以连接4;以此类推......最后连接的线的数量达到m-1停止(m指的是顶点的数量)。

在克鲁斯卡尔算法中,我们需要先把给定的权值排序,见下图:

然后按照编号顺序依次添加边(从1开始),保证添加的过程别形成回路就行(如果有就跳过添加这个边。)最后连接的线的数量达到m-1停止(m指的是顶点的数量)。

对于最短路径这里只讲解狄克斯特拉(Dijkstra)算法。

这里为了准确性,需要注意一个点,就是在每次更新之后,对于还在U中的点可以计算这个点和更新的点之间的距离,从而决定是否在下次更新。比如对于最短路径是4的时候,这时候看6,他的上一步得出当前最短距离是17,但是我们计算这时候4和6之间的距离,即10+6=16<17,所以可以更新6。

3)给定了数组的乱序数据,按照指定方法进行排序,会写出过程。

快速排序(仅完成第一趟即可)、堆排序(仅完成第一趟即可)、希尔排序(仅完成第一趟即可)、(自顶向下的)

(全部过程)、基数排序(全部过程)。

快速排序

堆排序

希尔排序

归并排序

基数排序

第二次分配按照十位,以此类推......

4)对于某棵给定的二叉树(二叉链表存储),能够画出先序线索树、中序线索树、后序线索树。

为了创建线索二叉树的算法设计方便,在线索二叉树中添加了一个头结点。头结点的data域为空,lchild指向无线索时的头结点,ltag为0;rchild指向按某种方式遍历二叉树的最后一个结点,rtag为1。

再记住下面作用即可:

5)给定了顺序的数据,会依次进行BST的插入操作。

BST指的是二叉查找树,如下图:

6)给定了顺序的数据,会依次进行AVL树的插入操作,不平衡时会进行旋转。

7)给定了顺序的数据,会依次进行红黑树的插入操作,注意结点颜色的变换与旋转。

红黑树首先是一颗二叉排序树,我们需要知道以下一些性质(或者是做题的技巧)

根节点的颜色为黑色,

如果一个节点是红色,它的所有孩子结点是黑色

对于每个节点,从该结点出发的所有路径上包含相同个数的黑色节点。

所有的外部节点颜色为黑色

对于插入的节点,查看它“叔叔”的状态(有叔叔还是没有叔叔),如果叔叔没有,就进行平衡变换(AVL变换),如果有叔叔,它的上三元(自己上面的三个(爸爸,叔叔,爷爷))变色。

8)会写ADT(抽象数据类型),类似于p.3031、p.6465、p.79、p.9798、p.185、p.249250。

(看书,这里不在总结)

9)对给定的图或网(加权图),会按照深度优先、广度优先的策略,写出遍历序列。

10)对于某棵给定的二叉树,能够写出先序遍历序列、中序遍历序列、后序遍历序列、层次遍历序列。

11)会对程序进行简单的时间复杂度分析

一些补充

拓扑排序

选择的结点应该没有前驱元素,选择之后,这个点以及相应连线在图上被删除,然后继续选择新的点:

B树和B+树

(看书,这里不在总结)