1、复习(一)一、选择题1下面关于线性表的叙述错误的是( D ) 。A、 线性表采用顺序存储必须占用一片连续的存储空间B、 线性表采用链式存储不必占用一片连续的存储空间C、 线性表采用链式存储便于插入和删除操作的实现D、 线性表采用顺序存储便于插入和删除操作的实现2设哈夫曼树中的叶子结点总数为 m,若用二叉链表作为存储结构,则该哈夫曼树中总共有( B )个空指针域。A、 2m-1 B、 2m C、 2m+1 D、 4m3设顺序循环队列 Q0:M-1的头指针和尾指针分别为 F 和 R,头指针 F 总是指向队头元素的前一位置,尾指针 R 总是指向队尾元素的当前位置,则该循环队列中的元素个数为( C )
2、 。A、 R-F B、 F-R C、(R-F+M)M D、(F-R+M)M4设某棵二叉树的中序遍历序列为 ABCD,前序遍历序列为 CABD,则后序遍历该二叉树得到序列为(A) 。A、 BADC B、 BCDA C、 CDAB D、CBDA5设某完全无向图中有 n 个顶点,则该完全无向图中有( A )条边。A、 n(n-1)/2 B、 n(n-1) C、 n 2 D、 n 2-16设某数据结构的二元组形式表示为 A=(D,R),D=01,02,03,04,05,06,07,08,09,R=r ,r=, , ,则数据结构 A 是( B ) 。A、线性结构 B、 树型结构 C、 物理结构 D、图型
3、结构7下面程序的时间复杂为( B )for(i=1,s=0; inext;p-data=q-data;p-next=q-next;free(q);B、q=p-next;q-data=p-data;p-next=q-next;free(q);C、q=p-next;p-next=q-next;free(q);D、q=p-next;p-data=q-data;free(q);9设有 n 个待排序的记录关键字,则在堆排序中需要( A )个辅助记录单元。A、 1 B、 n C、 nlog 2n D、 n 210设一组初始关键字记录关键字为(20,15,14,18,21,36,40,10),则以 20 为
4、基准记录的一趟快速排序结束后的结果为( A )。A、 10,15,14,18,20,36,40,21B、 10,15,14,18,20,40,36,21C、 10,15,14,20,18,40,36,2lD、 15,10,14,18,20,36,40,21二、填空题1. 为了能有效地应用 HASH 查找技术,必须解决的两个问题是(构造一个好的 HASH 函数)和(确定解决冲突的方法) 。2. 下面程序段的功能实现数据 x 进栈,要求在括号处填上正确的语句。typedef struct int s100; int top; sqstack;void push(sqstack else ( sta
5、ck.sstack.top=x );( stack.top+) ;3. 中序遍历二叉排序树所得到的序列是(有序)序列(填有序或无序) 。4. 快速排序的最坏时间复杂度为( O(n 2)) ,平均时间复杂度为( O(nlog 2n)) 。5. 设某棵二叉树中度数为 0 的结点数为 N0,度数为 1 的结点数为 N1,则该二叉树中度数为 2 的结点数为( N0-1) ;若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有(2N 0+N1)个空指针域。6. 设有向图 G 中有 n 个顶点 e 条有向边,所有的顶点入度数之和为 d,则 e 和 d 的关系为(e=d) 。7. (中序)遍历二叉排序树中
6、的结点可以得到一个递增的关键字序列(填先序、中序或后序) 。8. 设查找表中有 100 个元素,如果用二分法查找方法查找数据元素 X,则最多需要比较(7)次就可以断定数据元素 X 是否在查找表中。9. 不论是顺序存储结构的栈还是链式存储结构的栈,其入栈和出栈操作的时间复杂度均为( O(1)) 。10. 设有 n 个结点的完全二叉树,如果按照从自上到下、从左到右从 1 开始顺序编号,则第 i 个结点的双亲结点编号为( i/2) ,右孩子结点的编号为(2i+1) 。三、应用题1 设一组初始记录关键字序列为(45,80,48,40,22,78),则分别给出第 4 趟简单选择排序和第 4 趟直接插入排
7、序后的结果。参考答案:(22,40,45,48, 80,78) ,(40,45,48,80,22,78)2 设指针变量 p 指向双向链表中结点 A,指针变量 q 指向被插入结点 B,要求给出在结点A 的后面插入结点 B 的操作序列(设双向链表中结点的两个指针域分别为 llink 和rlink) 。参考答案:q-llink=p; q-rlink=p-rlink; p-rlink-llink=q; p-rlink=q;3 设一组有序的记录关键字序列为(13,18,24,35,47,50,62,83,90),查找方法用二分查找,要求计算出查找关键字 62 时的比较次数并计算出查找成功时的平均查找长度
8、。参考答案:2, ASL=(1*1+2*2+3*4+4*2)=25/94 设一棵树 T 中边的集合为(A,B),(A,C),(A,D),(B,E),(C,F),(C,G) ,要求用孩子兄弟表示法(二叉链表)表示出该树的存储结构并将该树转化成对应的二叉树。参考答案:树的链式存储结构 二叉树5已知待散列的线性表为(36,15,40,63,22) ,散列用的一维地址空间为06 ,假定选用的散列函数是 H(K)= K mod 7,若发生冲突采用线性探查法处理,试:(1)计算出每一个元素的散列地址并在下图中填写出散列表: 0 1 2 3 4 5 6(2)求出在查找每一个元素概率相等情况下的平均查找长度。
9、参考答案:H(36)=36 mod 7=1; H (22)=(1+1) mod 7=2; .冲突H(15)=15 mod 7=1;.冲突 H2(22)=(2+1) mod 7=3; H (15)=(1+1) mod 7=2;H(40)=40 mod 7=5;H(63)=63 mod 7=0;H(22)=22 mod 7=1; .冲突(1) 0 1 2 3 4 5 663 36 15 22 40(2)ASL= 6.1525 设有无向图 G,要求给出用普里姆算法构造最小生成树所走过的边的集合。参考答案:E=(1,3) ,(1,2),(3,5) ,(5,6) ,(6,4)四、算法设计题1 设有一组初
10、始记录关键字序列(K 1,K 2,K n) ,要求设计一个算法能够在 O(n)的时间复杂度内将线性表划分成两部分,其中左半部分的每个关键字均小于 Ki,右半部分的每个关键字均大于等于 Ki。参考答案: void quickpass(int r, int s, int t)int i=s, j=t, x=rs;while(ix) j=j-1; if (inext) for(q=hb;q!=0;q=q-next) if (q-data=p-data) break;if(q!=0) t=(lklist *)malloc(sizeof(lklist); t-data=p-data;t-next=hc;
11、 hc=t;复习(二)一、选择题1设一维数组中有 n 个数组元素,则读取第 i 个数组元素的平均时间复杂度为( C ) 。A、 O(n) B、 O(nlog 2n) C、 O(1) D、 O(n 2)2设一棵二叉树的深度为 k,则该二叉树中最多有( D )个结点。A、 2k-1 B、 2 k C、 2 k-1 D、 2 k-13设某无向图中有 n 个顶点 e 条边,则该无向图中所有顶点的入度之和为( D ) 。A、 n B、 e C、 2n D、 2e4在二叉排序树中插入一个结点的时间复杂度为( B ) 。A、 O(1) B、 O(n) C、 O(log 2n) D、 O(n 2)5设某有向图
12、的邻接表中有 n 个表头结点和 m 个表结点,则该图中有( C )条有向边。A、 n B、 n-1 C、 m D、 m-16设一组初始记录关键字序列为(345,253,674,924,627),则用基数排序需要进行( A )趟的分配和回收才能使得初始关键字序列变成有序序列。A、 3 B、 4 C、 5 D、 87设用链表作为栈的存储结构则退栈操作( B ) 。A、 必须判别栈是否为满 B、 必须判别栈是否为空C、判别栈元素的类型 D、 对栈不作任何判别8下列四种排序中( A )的空间复杂度最大。A、 快速排序 B、 冒泡排序 C、 希尔排序 D、 堆9设某二叉树中度数为 0 的结点数为 N0,
13、度数为 1 的结点数为 Nl,度数为 2 的结点数为N2,则下列等式成立的是( C ) 。A、 N 0=N1+1 B、 N 0=Nl+N2 C、 N 0=N2+1 D、 N 0=2N1+l10.设有序顺序表中有 n 个数据元素,则利用二分查找法查找数据元素 X 的最多比较次数不超过( A ) 。A、 log2n+1 B、 log 2n-1 C、 log 2n D、 log 2(n+1)二、填空题1 设有 n 个无序的记录关键字,则直接插入排序的时间复杂度为( O(n2)) ,快速排序的平均时间复杂度为(O(nlog 2n)) 。2 设指针变量 p 指向双向循环链表中的结点 X,则删除结点 X
14、需要执行的语句序列为( pllink-rlink=p-rlink; p-rlink-llink=p-rlink ) (设结点中的两个指针域分别为 llink 和 rlink) 。3 根据初始关键字序列(19,22,01,38,10)建立的二叉排序树的高度为(3) 。4 深度为 k 的完全二叉树中最少有(2 k-1)个结点。5 设初始记录关键字序列为(K 1,K 2,K n),则用筛选法思想建堆必须从第( n/2)个元素开始进行筛选。6 设哈夫曼树中共有 99 个结点,则该树中有(50)个叶子结点;若采用二叉链表作为存储结构,则该树中有(51)个空指针域。7 设有一个顺序循环队列中有 M 个存储
15、单元,则该循环队列中最多能够存储( m-1)个队列元素;当前实际存储((R-F+M)%M )个队列元素(设头指针 F 指向当前队头元素的前一个位置,尾指针指向当前队尾元素的位置) 。8 设顺序线性表中有 n 个数据元素,则第 i 个位置上插入一个数据元素需要移动表中( n+1-i )个数据元素;删除第 i 个位置上的数据元素需要移动表中( n-i )个元素。9 设一组初始记录关键字序列为(20,18,22,16,30,19) ,则以 20 为中轴的一趟快速排序结果为( (19,18,16, 20,30,22) ) 。10 设一组初始记录关键字序列为(20,18,22,16,30,19) ,则根
16、据这些初始关键字序列建成的初始堆为((16,18,19,20,32,22) ) 。三、计算题1、画出广义表 LS=( ) , (e) , (a , (b , c , d )的头尾链表存储结构。参考答案: -100eabcdLS2、下图所示的森林: (1) 求树(a)的先根序列和后根序列; (2) 求森林先序序列和中序序列;(3)将此森林转换为相应的二叉树;ABCDEFGHIJK(a)(b)参考答案:(1) ABCDEF; BDEFCA; (2) ABCDEFGHIJK; BDEFCAIJKHG(3)转换为相应的二叉树 AGBCDEFHIJK四、算法设计题1 设单链表中有仅三类字符的数据元素(大
17、写字母、数字和其它字符),要求利用原单链表中结点空间设计出三个单链表的算法,使每个单链表只包含同类字符。参考答案:typedef char datatype;typedef struct node datatype data; struct node *next;lklist;void split(lklist *head,lklist * ha=0,hb=0,hc=0;for(p=head;p!=0;p=head)head=p-next; p-next=0;if (p-data=A ha=p;else if (p-data=0 hb=p; else p-next=hc; hc=p;2. 设计
18、在链式存储结构上交换二叉树中所有结点左右子树的算法。参考答案:typedef struct node int data; struct node *lchild,*rchild; bitree;void swapbitree(bitree *bt)bitree *p;if(bt=0) return;swapbitree(bt-lchild); swapbitree(bt-rchild);p=bt-lchild; bt-lchild=bt-rchild; bt-rchild=p;3. 在链式存储结构上建立一棵二叉排序树。参考答案: #define n 10typedef struct nodei
19、nt key; struct node *lchild,*rchild;bitree;void bstinsert(bitree * bt-key=key;bt-lchild=bt-rchild=0;else if (bt-keykey) bstinsert(bt-lchild,key); else bstinsert(bt-rchild,key);void createbsttree(bitree *for(i=1;irj+1)temp=rj+1; ( rj+1=rj );rj=temp;exchange=1;if (exchange=0) return;三、应用题1. 设某棵二叉树的中序遍
20、历序列为 DBEAC,前序遍历序列为ABDEC,要求给出该二叉树的的后序遍历序列。参考答案:DEBCA2. 设无向图 G(如右图所示) ,给出该图的最小生成树上边的集合并计算最小生成树各边上的权值之和。参考答案:E=(1,5),(5,2),(5,3),(3,4),W=103. 设一组初始记录关键字序列为(15,17,18,22,35,51,60),要求计算出成功查找时的平均查找长度。参考答案:ASL=(1*1+2*2+3*4)/7=17/74. 设散列表的长度为 8,散列函数 H(k)=k mod 7,初始记录关键字序列为(25,31,8,27,13,68),要求分别计算出用线性探测法和链地址
21、法作为解决冲突方法的平均查找长度。参考答案:ASL1=7/6,ASL2=4/3四、算法设计题1 设计判断两个二叉树是否相同的算法。参考答案:typedef struct node datatype data; struct node *lchild,*rchild; bitree;int judgebitree(bitree *bt1,bitree *bt2)if (bt1=0 else if (bt1=0 | bt2=0 |bt1-data!=bt2-data) return(0);else return(judgebitree(bt1-lchild,bt2-lchild)*judgebit
22、ree(bt1-rchild,bt2-rchild);2 设计两个有序单链表的合并排序算法。参考答案: void mergelklist(lklist *ha,lklist *hb,lklist *while(ha!=0 else s-next=ha; s=ha;ha=ha-next;else if(s=0) hc=s=hb; else s-next=hb; s=hb;hb=hb-next;if(ha=0) s-next=hb; else s-next=ha;五、1、设计计算二叉树中所有结点值之和的算法。参考答案:void sum(bitree *bt,int sum(bt-lchild,s); sum(bt-rchild,s);