数据结构复习资料亲自整理.pdf
《数据结构复习资料亲自整理.pdf》由会员分享,可在线阅读,更多相关《数据结构复习资料亲自整理.pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 一、简答题 1、链表:链表就是一串存储数据的链式结构。链式的优点在于,每个数据之间都是相关联的。2、线性结构:线性结构是一个有序数据元素的集合。常用的线性结构有:线性表,栈,队列,双队列,数组,串。3、树与二叉树 二叉树是每个结点最多有两个子树的有序树;树是由 n(n=1)个有限节点组成一个具有层次关系的集合。树和二叉树的 2 个主要差别:1.树中结点的最大度数没有限制,而二叉树结点的最大度数为 2;2.树的结点无左、右之分,而二叉树的结点有左、右之分。4、堆 堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。5
2、、二叉排序树 二叉排序数的(递归)定义:1、若左子树非空,则左子树所有节点的值均小于它的根节点;2、若右子树非空,则右子树所有节点的值均大于于它的根节点;3、左右子树也分别为二叉排序树。二、应用题 1、树与二叉树 前中后序遍历序列 一、已知前序、中序遍历,求后序遍历 例:前序遍历:GDAFEMHZ 中序遍历:ADEFGHMZ 画树求法:第一步,根据前序遍历的特点,我们知道根结点为 G 第二步,观察中序遍历 ADEFGHMZ。其中 root 节点 G 左侧的 ADEF 必然是 root 的左子树,G 右侧的 HMZ 必然是 root 的右子树。第三步,观察左子树 ADEF,左子树的中的根节点必然
3、是大树的 root 的 leftchild。在前序遍历中,大树的 root 的 leftchild 位于 root 之后,所以左子树的根节点为 D。第四步,同样的道理,root 的右子树节点 HMZ 中的根节点也可以通过前序遍历求得。在前序遍历中,一定是先把 root 和 root 的所有左子树节点遍历完之后才会遍历右子树,并且遍历的左子树的第一个节点就是左子树的根节点。同理,遍历的右子树的第一个节点就是右子树的根节点。树与二叉树的转换 树转换为二叉树:二叉树转换为树:二叉树线索化 注意:图中的实线表示指针,虚线表示线索。结点 C 的左线索为空,表示 C 是中序序列的开始结点,无前趋;结点 E
4、 的右线索为空,表示 E 是中序序列的终端结点,无后继。线索二叉树中,一个结点是叶结点的充要条件为:左、右标志均是 1。2、图 邻接表 一、邻接表 邻接表是图的一种链式存储结构。邻接表中,对图中每个顶点建立一个单链表,第 i 个单链表中的结点表示依附于顶点 Vi的边(对有向图是以顶点 Vi为尾的弧)。邻接表中的表结点和头结点结构:表 结 点 adjvex nextarc info 头结点 data firstarc 二、无向图的邻接表 3、4、图 7-5 三、有向图的邻接表和逆邻接表(一)在有向图的邻接表中,第 i 个单链表链接的边都是顶点 i 发出的边。(二)为了求第 i 个顶点的入度,需要
5、遍历整个邻接表。因此可以建立逆邻接表。(三)在有向图的逆邻接表中,第 i 个单链表链接的边都是进入顶点 i 的边。四、邻接表小结 设图中有 n 个顶点,e 条边,则用邻接表表示无向图时,需要 n 个顶点结点,2e 个表结点;用邻接表表示有向图时,若不考虑逆邻接表,只需 n 个顶点结点,e 个边结点。在无向图的邻接表中,顶点 vi的度恰为第 i 个链表中的结点数。在有向图中,第 i 个链表中的结点个数只是顶点 vi的出度。在逆邻接表中的第 i 个链表中的结点个数为 vi的入度。邻接矩阵(有向、无向)1图的邻接矩阵表示法 在图的邻接矩阵表示法中:用邻接矩阵表示顶点间的相邻关系 用一个顺序表来存储顶
6、点信息 2图的邻接矩阵(Adacency Matrix)设 G=(V,E)是具有 n 个顶点的图,则 G 的邻接矩阵是具有如下性质的 n 阶方阵:【例】下图中无向图 G 5 和有向图 G 6 的邻接矩阵分别为 A l 和 A 2。广度优先遍历 广度优先遍历是连通图的一种遍历策略。其基本思想如下:1、从图中某个顶点 V0 出发,并访问此顶点;2、从 V0 出发,访问 V0 的各个未曾访问的邻接点 W1,W2,,Wk;然后,依次从 W1,W2,Wk出发访问各自未被访问的邻接点;3、重复步骤 2,直到全部顶点都被访问为止。例如下图中:1.从 0 开始,首先找到 0 的关联顶点 3,4 2.由 3 出
7、发,找到 1,2;由 4 出发,找到 1,但是 1 已经遍历过,所以忽略。3.由 1 出发,没有关联顶点;由 2 出发,没有关联顶点。所以最后顺序是 0,3,4,1,2 深度优先遍历 深度优先遍历是连通图的一种遍历策略。其基本思想如下:设 x 是当前被访问顶点,在对 x 做过访问标记后,选择一条从 x 出发的未检测过的边(x,y)。若发现顶点 y 已访问过,则重新选择另一条从 x 出发的未检测过的边,否则沿边(x,y)到达未曾访问过的 y,对 y 访问并将其标记为已访问过;然后从 y 开始搜索,直到搜索完从 y 出发的所有路径,即访问完所有从 y 出发可达的顶点之后,才回溯到顶点 x,并且再选
8、择一条从 x 出发的未检测过的边。上述过程直至从 x 出发的所有边都已检测过为止。例如下图中:1.从 0 开始,首先找到 0 的关联顶点 3 2.由 3 出发,找到 1;由 1 出发,没有关联的顶点。3.回到 3,从 3 出发,找到 2;由 2 出发,没有关联的顶点。4.回到 4,出 4 出发,找到 1,因为 1 已经被访问过了,所以不访问。所以最后顺序是 0,3,1,2,4 Prim 算法 基本思想:假设 G(V,E)是连通的,TE 是 G 上最小生成树中边的集合。算法从 Uu0(u0V)、TE开始。重复执行下列操作:在所有 uU,vVU 的边(u,v)E 中找一条权值最小的边(u0,v0)
9、并入集合 TE 中,同时 v0 并入 U,直到VU 为止。此时,TE 中必有 n-1 条边,T=(V,TE)为 G 的最小生成树。Prim 算法的核心:始终保持 TE 中的边集构成一棵生成树。注意:prim 算法适合稠密图,其时间复杂度为 O(n2),其时间复杂度与边得数目无关,而 kruskal 算法的时间复杂度为 O(eloge)跟边的数目有关,适合稀疏图。Krusal 算法 图中先将每个顶点看作独立的子图,然后查找最小权值边,这条边是有限制条件的,边得两个顶点必须不在同一个图中,如上图,第一个图中找到最小权值边为(v1,v3),且满足限制条件,继续查找到边(v4,v6),(v2,v5),
10、(v3,v6),当查找到最后一条边时,仅仅只有(v2,v3)满足限制条件,其他的如(v3,v4),(v1,v4)都在一个子图里面,不满足条件,至此已经找到最小生成树的所有边。拓扑排序 由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。对上图进行拓扑排序的结果:2-8-0-3-7-1-5-6-9-4-11-10-12 5、检索 二叉排序建立 typedefstruct node int data;struct node*lchild;struct node*rchild;node;voidInit(node*t)t=NULL;void InOrder(node*t)/中序遍历
11、输出 if(t!=NULL)InOrder(t-lchild);printf(%d,t-data);InOrder(t-rchild);二叉排序删除 btree*DelNode(btree*p)if(p-lchild)btree*r=p-lchild;/r 指向其左子树;btree*prer=p-lchild;/prer 指向其左子树;while(r-rchild!=NULL)/搜索左子树的最右边的叶子结点 r prer=r;r=r-rchild;p-data=r-data;if(prer!=r)/若 r 不是 p 的左孩子,把 r 的左孩子作为 r 的父亲的右孩子 prer-rchild=r
12、-lchild;else p-lchild=r-lchild;/否则结点 p 的左子树指向 r 的左子树 free(r);return p;else btree*q=p-rchild;/q 指向其右子树;free(p);return q;Huffman 树、编码与解码 例.给定有 18 个字符组成的文本:A A D A T A R A E F R T A A F T E R 求各字符的哈夫曼码。(1)统计:(2)构造 Huffman 树:(3)在左分枝标 0,右分枝标 1:(4)确定 Huffman 编码:(5)译码:例.给定代码序列:0 0 1 0 0 0 1 1 1 0 1 0 1 0 1
13、 0 1 1 1 10 文本为:A A F A R A D E T 散列存储 6、内排序 希尔排序 void ShellPass(SeqList R,int d)/希尔排序中的一趟排序,d 为当前增量 for(i=d+1;i=n;i+)/将 Rd+1n分别插入各组当前的有序区 if(Ri.key0&R0.key0 do increment=increment/3+1;/求下一增量 ShellPass(R,increment);/一趟增量为 increment 的 Shell 插入排序 while(increment1)/ShellSort 直接插入排序 voidlnsertSort(SeqLi
14、st R)/对顺序表 R 中的记录 R1.n按递增序进行插入排序 int i,j;for(i=2;i=n;i+)/依次插入 R2,Rn if(Ri.keyRi-1.key)/若 Ri.key 大于等于有序区中所有的 keys,则 Ri /应在原有位置上 R0=Ri;j=i-1;/R0是哨兵,且是 Ri的副本 do/从右向左在有序区 R1i-1中查找 Ri的插入位置 Rj+1=Rj;/将关键字大于 Ri.key 的记录后移 j-;while(R0.keyRj.key);/当 Ri.keyRj.key 时终止 Rj+1=R0;/Ri插入到正确的位置上 /endif /InsertSort 选择排序
15、 voidSelectSort(SeqList R)int i,j,k;for(i=1;in;i+)/做第 i 趟排序(1in-1)k=i;for(j=i+1;j=n;j+)/在当前无序区 Ri.n中选 key 最小的记录 Rk if(Rj.keyRk.key)k=j;/k 记下目前找到的最小关键字所在的位置 if(k!=i)/交换 Ri和 Rk R0=Ri;Ri=Rk;Rk=R0;/R0作暂存单元 /endif /endfor /SeleetSort 交换排序 voidBubbleSort(SeqList R)/R(l.n)是待排序的文件,采用自下向上扫描,对 R 做冒泡排序 int i,j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 复习资料 亲自 整理
限制150内