1、中北大学数据结构习题算法与数据结构习题第一到三章习题选择题1.对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为(C)0A.O(n)O(n)B.O(n)O(1)C.O(1)O(n)D.O(1)O(1)2.非空的循环单链表head的尾结点p满足(A)。A.P-next=headB.P-next=NILC,p=NILD,p=head3.在单链表指针为p的结点之后插入指针为s的结点,正确的操作是:(B)oA.p-next=s;s-next=p-next;Bs-next=p-next;p-next=s;C.p-next=s;p-next=s-next;Dp-next=s-next;p-nex
2、t=s;4.在双向链表指针p的结点前插入一个指针q的结点操作是(C)注:双向链表的结点结构为(pre,data,next)。A.p-pre=q;q-next=p;p-pre-next=q;q-pre=q;B.p-pre=q;p-pre-next=q;q-next=p;q-pre=p-pre;C.q-next=p;q-pre=p-pre;p-pre-next=q;p-pre=q;D.q-pre=p-pre;q-next=q;p-pre=q;p-pre=q;5.栈的特点是(B),队列的特点是(A),栈和队列都是(AA)。若进栈序列为1,2,3,4则(C)不可能是一个出栈序列(不一定全部进栈后再出栈
3、);若进队列的序列为1,2,3,4则(E)是一个出队列序列。,:A.先进先出B.后进先出C.进优于出D.出优于进:A.顺序存储的线性结构B.链式存储的线性结构C.限制存取点的线性结构D.限制存取点的非线性结构,:A.3,2,1,4B.3,2,4,1C.4,2,3,1D.4,3,2,1E.1,2,3,4F.1,3,2,46.一个栈的输入序列为123,n,若输出序列的第一个元素是n,输出第i(1=inext;p2=pb-next;pa-next=null;s1=0;s2=0;While(p1&p2)if(p1-datadata)p=p1;p1=p1-next;s2=s2+1;delete(p);e
4、lseif(p1-datap2-data)p2=p2-next;else(p1-data=p2-data)p=p1;p1=p1-next;p-next=pa-next;pa-next=p;p2=p2-next;s1=s1+1;While(p1)p=p1;p1=p1-next;delete(p);s2=s2+1解:本程序段功能是将pa和pb链表中的值相同的结点保留在pa链表中(pa中与pb中不同结点删除),pa是结果链表的头指针。链表中结点值与从前逆序。S1记结果链表中结点个数(即pa与pb中相等的元素个数)。S2记原pa链表中删除的结点个数。算法题1.写出下图双链表中对换值为23和15的两个结
5、点相互位置时修改指针的有关语句。结点结构为:(pre,data,next)解:设q=p-pre;贝Uq-next=p-next;p-next-pre=q;p-pre=q-pre;q-pre-next=p;p-next=q;q-pre=p2.顺序结构线性表LA与LB的结点关键字为整数。LA与LB的元素按非递减有序,线性表空间足够大。试给出一种高效算法,将LB中元素合到LA中,使新的LA的元素仍保持非递减有序。高效指最大限度的避免移动元素。解:VoidUnion(seqlistLA,seqlistLB)m=LA.length;n=LB.length;k=m+n-2;i=m-1;j=n-1;whil
6、e(i=0&j=0)if(LA.elemi=LB.elemj)LA.elemk=LA.elemi;k=k-1;i=i-1;elseLA.elemk=LB.elemj;k=k-1;j=j-1;while(j=0)LA.elemk=LB.elemj;k=k-1;j=j-1;3.给定一个带表头结点的单链表,设head为头指针,结点的结构为(data,next),data为整型元素,next为指针;试写出算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间。(要求;不允许使用数组作辅助空间)解:voidMiniDelete(LinkedListhead)LinkedList*pre,
7、*p,*u;while(head-next!=null)/循环到仅剩头结点。pre=head;p=pre-next;/p为工作指针,pre为最/4值的前驱while(p-next!=null)if(p-next-datanext-data)pre=p;p=p-next;/记住当前最小值结点的前驱print(%2d,pre-next-data);/输出最小值。u=pre-next;pre-next=u-next;free(u);/删除最小结点free(head);/释放头结点。4,试写一算法在带头结点的单链表结构上实现线性表操作Locate(L,x);解:intLocateElem_L(Link
8、List&L,ElemTypex)inti=0;LinkListp=L;while(p&p-data!=x)p=p-next;i+;if(!p)return0;elsereturni;5,已知单链表中的元素以值递增有序排列。试写一高效的算法,删除表中所有值大于mink且小于maxk的元素,同时释放被删结点空间。解:pre匚umaxk=maL?clnext;while(p&p-datanext;/查找第一个值mink的结点if(P)while(p&p-datanext;/查找第一个值maxk的结点q=pre-next;pre-next=p;/修改指针while(q!=p)s=q-next;del
9、eteq;q=s;/释放结点空间/delete6.试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间,并分析你的算法的时间复杂度。已知一个非纯集合B,试构造一个纯集合A,使A中只包含B中所有值各不相同的数据元素从集合B取出物件放入集合A要求集合A中同样物件不能有两件以上因此,算法的策略应该和例2-1基本相同,差别仅在于集合A的初始状态是“空集”voidunion(List&La,ListLb)InitList(La);/构造(空的)线性表LALa_len=ListLength(La);Lb_len=ListLength(Lb);fo
10、r(i=1;i=Lb_len;i+)GetElem(Lb,i,e);/取Lb中第i个数据元素赋给eif(!LocateElem(La,e,equal()ListInsert(La,+La_len,e);/LaG未存在和e相同的数据元素,则插入之/for/union例如:(2,3,3,5,6,6,6,8,12)对集合B而言,值相同的数据元素必定相邻对集合A而言,数据元素依值从小至大的顺序插入因此,数据结构改变了,解决问题的策略也相应要改变。voidpurge(List&La,ListLb)InitList(LA);La_len=ListLength(La);Lb_len=ListLength(L
11、b);/求线性表的长度for(i=1;i=Lb_len;i+)GetElem(Lb,i,e);/取Lb中第i个数据元素赋给eif(ListEmpty(La)|!equal(en,e)ListInsert(La,+La_len,e);en=e;/La中不存在和e相同的数据元素,则插入之/for/purge第四章串习题1.下面关于用的的叙述中,哪一个是不正确的?(B)A.用是字符的有限序列B.空用是由空格构成的用C.模式匹配是用的一种重要运算D.用既可以采用顺序存储,也可以采用链式存储2.设有两个用p和q,其中q是p的子用,求q在p中首次出现的位置的算法称为(C)A.求子用B.联接C.匹配D.求用
12、长3.用ababaaababaa的next数组为(C)。A.012345678999B.012121111212C.011234223456D.01230123223454.字符用ababaabab的nextval为(A)A.(0,1,0,1,0,4,1,0,1)B.(0,1,0,1,0,2,1,0,1)C.(0,1,0,1,0,0,0,1,1)D.(0,1,0,1,0,1,0,1,1)5、设字符用S=aabaabaabaac,T=aabaac(1)给出S和T的next值和nextval值;(2)若S作主用,T作模式用,试给出利用BF算法和KMPJ法的匹配过程。解:(1)S的next与next
13、val值分另为012123456789和002002002009;t的next与nextval值分别为012123和002003。(2)利用BF算法的匹配过程:第趟匹酉己:aabaabaabaacaabaac(i=6,j=6)aabaac(i=6,j=6)第二趟匹酉己:aabaabaabaacaa(i=3,j=2)(aa)baac第三趟匹酉己:aabaabaabaaca(i=3,j=1)(成功)(aa)baac第四趟匹酉己:aabaabaabaacaabaac(i=9,j=6)第五趟匹酉己:aabaabaabaacaa(i=6,j=2)第六趟匹酉己:aabaabaabaaca(i=6,j=1)
14、第七趟匹酉己:aabaabaabaac利用KMPJ法的匹配过程:第趟匹酉己:aabaabaabaac第二趟匹酉己:aabaabaabaac第三趟匹酉己:aabaabaabaac成功)aabaac(i=13,j=7)第6章树和二叉树习题选择题1、已知一算术表达式的中缀形式为A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为(D)A.-A+B*C/DEB.-A+B*CD/EC.-+*ABC/DED.-+A*BC/DE2、设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3与森林F对应的二叉树根结点的右子树上的结点个数是(D)。A.M1B.M1+M2C.M2+M33、
15、有关二叉树下列说法正确的是(A.二叉树的度为2B.一棵二叉树白度可以小于2C.二叉树中至少有一个结点的度为D.二叉树中任何一个结点的度都为4、二叉树的第I层上最多含有结点数为(C)A.2IB.2I-1-1C.2I-1D.2I-15、一个具有1025个结点的二叉树的高八为(C)10至1024之间A.11B.10C.11至1025之间D解析:具有n6、高度为K的二叉树最大的结点数为(C)。A.2kB.2k-1C.2k-1D.2k-1-17、利用二叉链表存储树,则根结点的右指针是(C)。A.指向最左孩子B.指向最右孩子C.空D.非空8、对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、
16、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用(C)次序的遍历实现编号。A.先序B.中序C.后序D.从根开始按层次遍历9、某二叉树中序序列为A,B,C,D,E,F,G,后序序列为B,D,C,A,F,G,E则先序序列是:BA.E,G,F,A,C,D,BB.E,A,C,B,D,G,FC.E,A,G,C,F,B,DD.上面的都不对10、上题的二叉树对应的森林包括多少棵树(B)A.lB.2C.3D.概念上是错误的11、一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足(C)A.所有的结点均无左孩子B.所有的结点均无右孩子C.只有一个叶子结点D.是任意
17、一棵二叉树12、在二叉树结点的先序序列,中序序列和后序序列中,所有叶子结点的先后顺序(B)A.都不相同B.完全相同C.先序和中序相同,而与后序不同D.中序和后序相同,而与先序不同13、在完全二叉树中,若一个结点是叶结点,则它没(C)。A.左子结点B.右子结点C.左子结点和右子结点D.左子结点,右子结点和兄弟结点14、n个结点的线索二叉树上含有的线索数为(C)A.2nB.n-lC.n+1D.n(解析:一棵n结点树包含n-1条边,而每个结点有两个指针域即总共2n个指针,减去表示边的指向关系(即左右子树)的n-1条边,剩下n+1条边即为线索。)15、下述编码中哪一个不是前缀码(B)。A.(00,01
18、,10,11)B.(0,1,00,11)C.(0,10,110,111)D.(1,01,000,001)(解析:一组编码中任何一个编码均不为其他编码的前缀.避免了多义性,且缩短了报文总长)16、在下述结论中,正确的是(D)只有一个结点的二叉树的度为0;二叉树的度为2;二叉树的左右子树可任意交换;深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。A.B.C.D.17、若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是(B)A.9B.11C.15D.不确定(解析:任意一棵二叉树,度为零的节点即叶子节点的数比度为二的节点多一。)18、具有10个叶结点的二叉树中有(B
19、)个度为2的结点A.8B.9C.10D.1l19、一棵完全二叉树上有1001个结点,其中叶子结点的个数是(D)(1023是满二叉树,有512片叶子。1001比1023少22个结点,所以有512-22+22/2=501片叶子。511是满二叉树,有256片叶子。1001比511多490个结点,所以有256+490-(490+1)/2=501片叶子。所以答案就是501了。)A.250B.500C.254D.50120、有n个叶子的哈夫曼树的结点总数为(D)。A,不确定B.2nC.2n+1D.2n-121、二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK中序遍历:HFIEJKG。该二叉树根的右
20、子树的根是(C)。A、EB、FC、GD、H22、设森林F对应的二叉树为B,它有m个结点,B的根为p,p的右子树结点个数为n,森林F中第一棵树的结点个数是(A)A.m-nB.m-n-1C.n+1D.条件不足,无法确定23、用一维数组存储二叉树时,总是以(D)遍历顺序存储结点A.先序B.中序C.后序D,按层次遍历24、对一棵二叉树进行层次遍历时,应借助于一个(D)。A.顺序表B.数组C.栈D.队列25、某二叉树的先序序列和后序序列正好相反,则该二叉树一定是(C)的二叉树。A.空或只有一个结点B.任一结点无左子树C,高度等于其结点数D.任一结点无右子树26、设树T的度为4,其中度为1,2,3和4的结
21、点个数分别为4,2,1,1则T中的叶子数为(D)A.5B.6C.7D.8(设度为0的结点数为n0,度为1的结点数为n1,度为2的结点数为n2,度为3的结点数为n3,度为4的结点数为n4,那么这棵树总的结点数为n0+n1+n2+n3+n4;又因为树中的每个结点(除了根结点外)都有一个指针指向它,那么这棵树总的结点数为总的指针数加上1;总的指针数=1*n1+2*n2+3*n3+4*n4;故有:1+1*n1+2*n2+3*n3+4*n4=n0+n1+n2+n3+n4;从而有n0=1+n2+2*n3+3*n4=1+2+2*1+3*1=8;)27、将一棵树t转换为孩子一兄弟链表表示的二叉树h,则t的后根
22、序遍历是h的(B)A.先序遍历B.中序遍历C.后序遍历28、某二叉树T有n个结点,设按某种顺序对T中的每个结点进行编号,编号为1,2,n,且有如下性质:T中任一结点V,其编号等于左子树上的最小编号减1,而V的右子树的结点中,其最小编号等于V左子树上结点的最大编号加1。这时是按(B)编号的。A.中序遍历序列B.先序遍历序列C.后序遍历序列D.层次顺序应用题1、从概念上讲,树,森林和二叉树是三种不同的数据结构,将树,森林转化为二叉树的基本目的是什么,并指出树和二叉树的主要区别。答:树的孩子兄弟链表表示法和二叉树二叉链表表示法,本质是一样的,只是解释不同,也就是说树(森林的特例)可用二叉树唯一表示,
23、并可使用二叉树的一些算法去解决树和森林中的问题。树和二叉树的区别有:一是二叉树的度至多为2,树无此限制;二是二叉树有左右子树之分,即使在只有一个分枝的情况下,也必须指出是左子树还是右子树,树无此限制。2、试找出满足下列条件的二叉树1)先序序列与后序序列相同;2)中序序列与后序序列相同;3)先序序列与中序序列相同;1)、既不含左子树,也不含右子树的二叉树。2)、不含右子树的二叉树。3)、不含左子树的二叉树。3、已知一棵度为k的树中有ni个度为1的结点,奥个度为2的结点,一个度为k的结点,问该树中有多少个叶子结点?解:根据树的定义,在一颗树中,除树根结点外,每个结点有且仅有一个前驱结点,也就是说,
24、每个结点与指向它的一个分支一一对应,所以除树根结点之外的结点树等于所有结点的分支数,即度数,从而可得树中的结点数等于所有结点的度数加1。总结点数为1n12n23n3knk而度为0的结点数就应为总结点数减去度不为0的结点数的总和,即kn0=1n12n23n3.knk-(nn2n3nk)=1%(i1)ni-J5、用一维数组存放的一棵完全二叉树如下图所示:ABCDEFGHIJKL写出后序遍历该二叉树时访问结点的顺序。解析:用一维数组存储二叉树时,总是以层次遍历顺序存储结点答:HIDJKEBLFGCA6、对下图所示二叉树分别按先序、中序、后序遍历,给出相应的结点序列,同时给二叉树加上中序线索。(1)先序序列:ABDEHCFG(2)中序序列:DHEBAFCG(3)后序序列:HEDBFGCAA7、设一棵二叉树的先序、中序遍历序列分别为先序遍历序列:CnullABDFCEGH中A序遍历JWhBFDAGEHC(1)画出这棵二叉树。(2)将这棵二叉树转换成对应的树(或森林)尸
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1