数据结构:Python语言描述期末试卷及答案5套_第1页
数据结构:Python语言描述期末试卷及答案5套_第2页
数据结构:Python语言描述期末试卷及答案5套_第3页
数据结构:Python语言描述期末试卷及答案5套_第4页
数据结构:Python语言描述期末试卷及答案5套_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构试卷(一)选择题(每题2分,共20分)1.栈和队列的共同特点是(A)。A.只允许在端点处插入和删除元素B.都是先进后出C.都是先进先出D.没有共同点2.用链接方式存储的队列在进行插入运算时(D)。A.仅修改头指针B.头、尾指针都要修改C.仅修改尾指针D.头、尾指针可能都要修改3.以下数据结构中(D)是非线性结构。A.队列B.栈C.线性表D.二叉树4.设有一个二维数组A[m][n],假设A[0][0]的存放位置在644(10),A[2][2]的存放位置在676(10),每个元素占一个空间,那么A[3][3](10)存放在(C)位置。脚注(10)表示用十进制表示。A.688B.678C.692D.6965.树最适合用来表示(C)。A.有序数据元素B.无序数据元素C.元素之间具有分支层次关系的数据D.元素之间无联系的数据6.二叉树的第k层的结点数最多为(D)。A.2k-1B.2K+1C.2K-1D.2k-17.若有18个元素的有序表存放在一维数组A[19]中,第一个元素放在A[1]中,现进行二分查找,则查找A[3]的比较序列的下标依次为(C)。A.1,2,3B.9,5,2,3C.9,5,3D.9,4,2,38.对n个记录的文件进行快速排序所需要的辅助存储空间大致为(D)。A.O(1)B.O(n)C.O(1og2n)D.O(n2)9.对线性表(7,34,55,25,64,46,20,10)进行散列存储时,若选用H(K)=K%9作为散列函数,则散列地址为1的元素有(C)个。A.1B.2C.3D.410.设有6个结点的无向图,该图至少应有(B)条边才能确保是一个连通图。A.5B.6C.7D.8二、填空题(每空1分,共26分)1.通常从4个方面评价算法的质量,即正确性、易读性、强壮性和高效性。2.一个算法的时间复杂度为(n3+n2log2n+14n)/n2,其数量级表示_o(n)_。3.假定一棵树的广义表表示为A(C,D(E,F,G),H(I,J)),则树中所含的结点数为9个,树的深度为3,树的度为3。4.后缀算式923+-102/-的值为-1_。中缀算式(3+4X)-2Y/3对应的后缀算式为34X*+2Y3/*-。5.若用链表存储一棵二叉树,每个结点除数据域外还有指向左孩子和右孩子的两个指针。在这种存储结构中,n个结点的二叉树共有2n个指针域,其中有n-1指针域存放了地址,有n+1个指针是空指针。6.对于一个有n个顶点和e条边的有向图和无向图,在其对应的邻接表中所含的边结点分别为e个和2e个。7.AOV网是一种没有回路的图。8.在一个有n个顶点的无向完全图中包含有_n(n-1)/2_条边,在一个有n个顶点的有向完全图中包含有_n(n-1)_条边。9.假定一个线性表为(12,23,74,55,63,40),若按key%4条件进行划分,使得同一余数的元素成为一个子表,则得到的4个子表分别为_{12,40}_、_φ_、{74}_和_{23,55,63}_。10.在向一棵B-树插入元素的过程中若最终引起树根结点的分裂,则新树比原树的高度_多1_。11.在堆排序的过程中,对任一分支结点进行筛运算的时间复杂度为_o(log2n)__,整个堆排序过程的时间复杂度为_o(nlog2n)_。12.在快速排序、堆排序、归并排序中归并排序是稳定的。三、计算题(每题6分,共24分)1.在如图A.1所示的数组A中链接存储了一个线性表,表头指针为A[0].next,试写出该线性表。图A.1数组A线性表为:A[3]->A[2]->A[7]->A[1]->A[5]->A[4]->A[0]->A[3]2.请画出图A.2所示的邻接矩阵和邻接表。图A.2无向图邻接矩阵:邻接表:1234213531245413552343.已知一个图的顶点集V和边集E如下:V={1,2,3,4,5,6,7};E={(1,2)3,(1,3)5,(1,4)8,(2,5)10,(2,3)6,(3,4)15,(3,5)12,(3,6)9,(4,6)4,(4,7)20,(5,6)18,(6,7)25};用克鲁斯卡尔算法得到最小生成树,试写出在最小生成树中依次得到的各条边。(0,3)2——(4,6)4——(0,2)5——(1,5)6——(0,1)8——(3,6)10——(5,7)20画出向小根堆中加入数据4、2、5、8、3时每加入一个数据后堆的变化。四、阅读算法(每题7分,共14分)1.

1

defmynote(L):

2

#L是不带头结点的单链表的头指针

3

ifLisnotNoneandL.nextisnotNone:

4

q=L

5

l=L.next

6

p=L

7

whilep.next:

8

p=p.next#S1

9

p.next=q

10

q.next=None

11

returnL请回答下列问题:(1)说明语句S1的功能;(2)说明语句组S2的功能;(3)设链表表示的线性表为(a1,a2,…,an),写出算法执行后的返回值所表示的线性表。答:(1)找到链表的最后一个节点。

(2)将链表的最后一个节点指向L,并将L的下一节点清空。

(3)a2,...,an,a1。2.

1

defABC(BT):

2

#BT是二叉树的结点

3

ifBTisnotNone:

4

ABC(BT.lchild)

5

ABC(BT.rchild)

6

print(BT.data,end='')该算法的功能是_打印二叉树各节点的值_。五、算法填空(共8分)二叉搜索树的查找—递归算法:

1

defFind(BST,item):

2

#BST是搜索二叉树的结点,item是查找的元素

3

ifBSTisNone:

4

returnfalse#查找失败

5

ifitem==BST.data:

6

item=BST.data#查找成功

7

returntrue

8

elifitem<BST.data:

9

returnFind(BST->left,item)

10

else:

11

returnFind(BST->right,item)六、编写算法(共8分)统计出单链表HL中结点的值等于给定值X的结点数。定义函数如下:defis_count(self,X): cur=self.__headcount=0whilecurisnotNone:ifcur.data==X: count+=1cur=cur.nextreturncount数据结构试卷(二)一、选择题(每题3分,共24分)1.下面关于线性表的叙述错误的是(D)。A.线性表采用顺序存储必须占用一片连续的存储空间B.线性表采用链式存储不必占用一片连续的存储空间C.线性表采用链式存储便于插入和删除操作的实现D.线性表采用顺序存储便于插入和删除操作的实现2.设哈夫曼树中的叶子结点总数为m,若用二叉链表作为存储结构,则该哈夫曼树中总共有(B)个空指针域。A.2m-1B.2mC.2m+1D.4m3.设顺序循环队列Q[0:M-1]的头指针和尾指针分别为F和R,头指针F总是指向队头元素的前一位置,尾指针R总是指向队尾元素的当前位置,则该循环队列中的元素个数为(C)。A.R-FB.F-RC.(R-F+M)%MD.(F-R+M)%M4.设某棵二叉树的中序遍历序列为ABCD、前序遍历序列为CABD,则后序遍历该二叉树得到的序列为(A)。A.BADCB.BCDAC.CDABD.CBDA5.设某完全无向图中有n个顶点,则该完全无向图中有(A)条边。A.n(n-1)/2B.n(n-1)C.n2D.n2-16.设某棵二叉树中有2000个结点,则该二叉树的最小高度为(C)。A.9B.10C.11D.127.设某有向图中有n个顶点,则该有向图对应的邻接表中有(B)个表头结点。A.n-1B.nC.n+1D.2n-18.设有一组初始记录关键字序列(5,2,6,3,8),以第一个记录关键字5为基准进行一趟快速排序的结果为(C)。A.2,3,5,8,6B.3,2,5,8,6C.3,2,5,6,8D.2,3,6,5,8二、填空题(每空2分,共24分)1.为了能有效地应用Hash查找技术,必须解决的两个问题是___如何构造哈希函数和如何解决冲突。2.下面程序段的功能实现数据x进栈,要求在下画线处填上正确的语句。

1

classSqStack:

2

def__init__(self):

3

self.data=[None]*100

4

self.top=0

5

#......

6

7

#......

8

9

defpush(self,x):

10

ifself.top==100:

11

raise('overflow')

12

else:

13

__self.data[top]=x____

14

___top=top+1___3.中序遍历二叉排序树所得到的序列是____有序____序列(填有序或无序)。4.快速排序的最坏时间复杂度为___O(n2)_____,平均时间复杂度为___O(nlogn)_____。5.设某棵二叉树中度数为0的结点数为N0,度数为1的结点数为N1,则该二叉树中度数为2的结点数为____N0-1___;若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有____N1+2N0____个空指针域。6.设某无向图中的顶点数和边数分别为n和e,所有顶点的度数之和为d,则e=____d/2____。7.设一组初始记录关键字序列为(55,63,44,38,75,80,31,56),则利用筛选法建立的初始堆为____大根堆:(80,75,55,56,63,44,31,38)小根堆:(31,38,44,56,75,80,55,63)____。8.已知一个有向图的邻接表存储结构如图A.3所示,从顶点1出发,DFS遍历的输出序列是_____1,3,4,5,2___,BFS遍历的输出序列是____1,3,2,4,5____。图A.3图的邻接表存储结构三、应用题(每题6分,共36分)1.设一组初始记录关键字序列为(45,80,48,40,22,78),则分别给出第4趟简单选择排序和第4趟直接插入排序后的结果。答:简单选择排序:22,40,45,48,80,78 直接插入排序:40,45,48,80,22,782.设指针变量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时的比较次数并计算出查找成功时的平均查找长度。答:比较次数2,平均查找长度25/9图A.4无向图G4.设一棵树T中边的集合为{(A,B),(A,C),(A,D),(B,E),(C,F),(C,G)},要求用孩子兄弟表示法(二叉链表)表示出该树的存储结构并将该树转化成对应的二叉树。答:5.设有如图A.4所示的无向图G,要求给出用普里姆算法构造最小生成树所走过的边的集合。答:{(1,3),(1,2),(3,5),(5,6),(6,4)}6.设有一组初始记录关键字为(45,80,48,40,22,78),要求构造一棵二叉排序树并给出构造过程。答:构造过程如下:插入过程:若二叉排序树为空,则待插入结点*S作为根结点插入到空树中;当非空时,将待插结点关键字S->key和树根关键字t->key进行比较,若s->key=t->key,则无须插入,若s->key<t->key,则插入到根的左子树中,若s->key>t->key,则插入到根的右子树中。而子树中的插入过程和在树中的插入过程相同,如此进行下去,直到把结点*s作为一个新的树叶插入到二叉排序树中,或者直到发现树已有相同关键字的结点为止。构造结果:四、算法设计题(每题8分,共16分)1.设有一组初始记录关键字序列(K1,K2,…,Kn),要求设计一个算法能够在O(n)的时间复杂度内将线性表划分成两部分,其中左半部分的每个关键字均小于Ki,右半部分的每个关键字均大于等于Ki。

1

defquicksort(list,i,n):

2

left=i

3

right=n

4

temp=list[i]

5

whileleft<right:

6

whileleft<rightandlist[right]>temp:

7

right=right-1

8

ifleft<right:

9

list[left]=list[right]

10

left=left+1

11

whileleft<rightandlist[left]<temp:

12

left=left+1

13

ifleft<right:

14

list[right]=list[left]

15

right=right-1

16

list[left]=temp2.设有两个集合A和集合B,要求设计生成集合C=A∩B的算法,其中集合A、B和C用链式存储结构表示。

1

classNode():

2

i=0

3

def_init_(self,data):

4

self.data=data

5

self.next=None

6

Node.i+=1

7

8

defandOperation(a,b,c):

9

p=a

10

c=None

11

whilep!=None:

12

q=b

13

whileq!=None:

14

ifp.data==q.data:

15

break

16

q=q.next

17

ifq!=None:

18

t=Node(p.data)

19

t.next=c

20

c=t

21

p=p.next数据结构试卷(三)一、选择题(每题2分,共20分)1.设某数据结构的二元组形式表示为A=(D,R),D={01,02,03,04,05,06,07,08,09},R={r},r={<01,02>,<01,03>,<01,04>,<02,05>,<02,06>,<03,07>,<03,08>,<03,09>},则数据结构A是(B)。A.线性结构B.树形结构C.物理结构D.图形结构2.下面程序的时间复杂度为(B)。

1

i=1

2

s=0

3

whilei<=n:

4

i+=1

5

t=1

6

forjinrange(1,i):

7

t=t*j

8

s=s+tA.O(n)B.O(n2)C.O(n3)D.O(n4)3.设指针变量p指向单链表中的结点A,若删除单链表中的结点A,则需要修改指针的操作序列为(A)。A.q=p.next;p.data=q.data;p.next=q.next;B.q=p.next;q.data=p.data;p.next=q.next;C.q=p.next;p.next=q.next;D.q=p.next;p.data=q.data;4.设有n个待排序的记录关键字,在堆排序中需要(A)个辅助记录单元。A.1B.nC.nlog2nD.n25.设一组记录关键字为(20,15,14,18,21,36,40,10),则以20为基准记录的一趟快速排序结束后的结果为(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,21D.15,10,14,18,20,36,40,216.设二叉排序树中有n个结点,则二叉排序树的平均查找长度为(B)。A.O(1)B.O(log2n)C.O(n)D.O(n2)7.设无向图G中有n个顶点、e条边,则其对应的邻接表中的表头结点和表结点的个数分别为(D)。A.n、eB.e、nC.2n、eD.n、2e8.设某强连通图中有n个顶点,则该强连通图中至少有(C)条边。A.n(n-1)B.n+1C.nD.n(n+1)9.设有5000个待排序的记录关键字,如果需要用最快的方法选出其中最小的10个记录关键字,则用下列(B)方法可以达到此目的。A.快速排序B.堆排序C.归并排序D.插入排序10.下列4种排序中(D)的空间复杂度最大。A.插入排序B.冒泡排序C.堆排序D.归并排序二、填空题(每空1分,共20分)1.数据的物理结构主要包括顺序存储结构和链式存储结构两种情况。2.设一棵完全二叉树中有500个结点,则该二叉树的深度为____9_____;若用二叉链表作为该完全二叉树的存储结构,则共有_____501____个空指针域。3.设输入序列为(1,2,3),则经过栈的作用后可以得到___5______种不同的输出序列。4.设有向图G用邻接矩阵A[n][n]作为存储结构,则该邻接矩阵中第i行上的所有元素之和等于顶点i的_____出度____,第i列上的所有元素之和等于顶点i的___入度______。5.设哈夫曼树中共有n个结点,则该哈夫曼树中有____0_____个度数为1的结点。6.设有向图G中有n个顶点、e条有向边,所有的顶点入度数之和为d,则e和d的关系为____e=d_____。7.____中序_____遍历二叉排序树中的结点可以得到一个递增的关键字序列(填先序、中序或后序)。8.设查找表中有100个元素,如果用二分查找方法查找数据元素X,则最多需要比较_____7____次就可以断定数据元素X是否在查找表中。9.不论是顺序存储结构的栈还是链式存储结构的栈,其入栈和出栈操作的时间复杂度均为___O(1)______。10.设有n个结点的完全二叉树,如果按照从自上到下、从左到右从1开始顺序编号,则第i个结点的双亲结点的编号为___i/2(向下取整)______,右孩子结点的编号为___2*i+1______。11.设一组初始记录关键字为(72,73,71,23,94,16,5),则以记录关键字72为基准的一趟快速排序的结果为___5167123729473______。12.设有向图G中的有向边的集合E={<1,2>,<2,3>,<1,4>,<4,2>,<4,3>},则该图的一种拓扑序列为___1423______。13.下列算法实现在顺序散列表中查找值为x的关键字的功能,请在下画线处填上正确的语句。

1

classrecord(object):

2

def__init__(self,key,others):

3

self.key=key

4

self.others=others

5

6

defhashSqSearch(hashTable,k):

7

i=j=k%P

8

whilehashTable[j].key!=kandhashTable[j].flag!=0:

9

j=___j+1___%m

10

ifi==j:

11

return-1

12

if_hashtable[j].key==__k___:

13

returnj

14

elsereturn-114.下列算法实现在二叉排序树上查找关键值k的功能,请在下画线处填上正确的语句。

1

defFind(BST,k):

2

#BST是搜索二叉树的结点,k是查找的元素

3

ifBSTisNone:

4

returnfalse#查找失败

5

ifk==BST.data:

6

k=BST.data#查找成功

7

return_true_____

8

elifitem<BST.data:

9

returnFind(__BST.lchild____,k)

10

else:

11

returnFind(__BST.rchild____,k)三、计算题(每题10分,共30分)1.已知二叉树的前序遍历序列是AEFBGCDHIKJ、中序遍历序列是EFAGBCHKIJD,画出此二叉树,并画出它的后序线索二叉树。2.已知待散列的线性表为(36,15,40,63,22),散列用的一维地址空间为[0..6],假定选用的散列函数是H(K)=Kmod7,若发生冲突采用线性探查法处理,试计算以下问题:(1)计算出每一个元素的散列地址并在图A.5中填写出散列表。图A.5填写散列表01234566336152240(2)求出在查找每一个元素概率相等情况下的平均查找长度。(1+2+1+1+3)/5=1.6。3.已知序列(10,18,4,3,6,12,1,9,18,8),请用快速排序写出每一趟排序的结果。第一趟排序结果:9436110121818第二趟排序结果:1436910121818第三趟排序结果:1436910121818第四趟排序结果:1346910121818四、算法设计题(每题15分,共30分)1.设计在单链表中删除值相同的多余结点的算法。class

Node:

def

__init__(self,

data=None,

nxt=None):

self.data

=

data

self.next

=

nxt

def

delete_same_node(node):

p

=

node

if

p

is

None:

return

elif

p.next

is

None:

return

else:

q

=

node.next

while

q!=None:

if

p.data==q.data:

p.next

=

q.next

p

=

q

q

=

q.next

else:

p

=

p.next

q

=

q.next

return

2.设计一个求结点x在二叉树中的双亲结点的算法。class

TreeNode:

def

__init__(self,

data=None,

lchild=None,

rchild=None):

self.data

=

data

self.lchild

=

lchild

self.rchild

=

rchild

def

find_parent(root,

target):

if

root

is

None:

return

None

elif

root.lchild

is

target

or

root.rchild

is

target:

return

root

elif

root.lchild

is

None

and

root.rchild

is

None:

return

None

else:

return

find_parent(root.lchild,

target)

or

find_parent(root.rchild,

target)

数据结构试卷(四)一、选择题(每题2分,共20分)1.设一维数组中有n个数组元素,则读取第i个数组元素的平均时间复杂度为(C)。A.O(n)B.O(nlog2n)C.O(1)D.O(n2)2.设一棵二叉树的深度为k,则该二叉树中最多有(D)个结点。A.2k-1B.2kC.2k-1D.2k-13.设某无向图中有n个顶点、e条边,则该无向图中所有顶点的入度之和为(D)。A.nB.eC.2nD.2e4.在二叉排序树中插入一个结点的时间复杂度为(C)。A.O(1)B.O(n)C.O(log2n)D.O(n2)5.设某有向图的邻接表中有n个表头结点和m个表结点,则该图中有(C)条有向边。A.nB.n-1C.mD.m-16.设一组初始记录关键字序列为(345,253,674,924,627),则用基数排序需要进行(A)趟的分配和回收才能使初始关键字序列变成有序序列。A.3B.4C.5D.87.设用链表作为栈的存储结构,则退栈操作(B)。A.必须判别栈是否为满B.必须判别栈是否为空C.判别栈元素的类型D.对栈不做任何判别8.下列4种排序中(D)的空间复杂度最大。A.快速排序B.冒泡排序C.希尔排序D.堆9.设某二叉树中度数为0的结点数为N0,度数为1的结点数为N1,度数为2的结点数为N2,则下列等式成立的是(C)。A.N0=N1+1B.N0=N1+N2C.N0=N2+1D.N0=2N1+110.设有序顺序表中有n个数据元素,则利用二分查找法查找数据元素X的最多比较次数不超过(A)。A.log2n+1B.log2n-1C.log2nD.log2(n+1)二、填空题(除第2题2分外每空1分,共20分)1.设有n个无序的记录关键字,则直接插入排序的时间复杂度为O(n2),快速排序的平均时间复杂度为O(nlog2n)。2.设指针变量p指向双向循环链表中的结点X,则删除结点X需要执行的语句序列为p->llink->rlink=p->rlink;p->rlink->llink=p->llink;(设结点中的两个指针域分别为llink和rlink)。3.根据初始关键字序列(19,22,01,38,10)建立的二叉排序树的高度为3。4.深度为k的完全二叉树中最少有2k-1个结点。5.设初始记录关键字序列为(K1,K2,…,Kn),则用筛选法思想建堆必须从[n/2]第个元素开始进行筛选。6.设哈夫曼树中共有99个结点,则该树中有50个叶子结点;若采用二叉链表作为存储结构,则该树中有100个空指针域。7.设一个顺序循环队列中有M个存储单元,则该循环队列中最多能够存储M-1个队列元素;当前实际存储(R–F+M)%M个队列元素(设头指针F指向当前队头元素的前一个位置,尾指针R指向当前队尾元素的位置)。8.设顺序线性表中有n个数据元素,则在第i个位置上插入一个数据元素需要移动表中的n-i+1个数据元素;删除第i个位置上的数据元素需要移动表中的n–i个元素。9.设一组初始记录关键字序列为(20,18,22,16,30,19),则以20为中轴的一趟快速排序的结果为(18,16,19,20,22,30)。10.设一组初始记录关键字序列为(20,18,22,16,30,19),则根据这些初始关键字序列建成的初始堆为(16,18,19,20,30,22)。11.设某无向图G中有n个顶点,用邻接矩阵A作为该图的存储结构,则顶点i和顶点j互为邻接点的条件是A[i][j]=A[j][i]=1。12.设无向图对应的邻接矩阵为A,则A中第i行上非0元素的个数等于第i列上非0元素的个数(填等于、大于或小于)。13.设前序遍历某二叉树的序列为ABCD,中序遍历该二叉树的序列为BADC,则后序遍历该二叉树的序列为BDCA。14.设散列函数H(k)=kmodp,解决冲突的方法为链地址法。要求在下列算法画线处填上正确的语句完成在散列表hashtalbe中查找关键字值等于k的结点,成功时返回指向关键字的指针,不成功时返回标志0。

1

classNode(object):

2

def__init__(self,key=None,next=None):

3

self.key=key

4

self.next=next

5

6

defcreatelkHash(hashTable):

7

foriinrange(m):

8

hashTable[i]=0

9

foriinrange(n):

10

s=Node()

11

s.key=a[i]

12

k=a[i]%P

13

s.next=hashTable[k]

14

hashTable[k]=s三、计算题(每题10分,共30分)1.画出广义表LS=((),(e),(a,(b,c,d)))的头尾链表存储结构。2.设有如图A.6所示的森林:(1)求树(a)的先根序列和后根序列;ABCDEFBDEFCA(2)求森林的先序序列和中序序列;ABCDEFGHIJKBDEFCAIJKHG(3)将此森林转换为相应的二叉树。图A.6森林图3.设散列表的地址范围是[0..9],散列函数为H(key)=(key2+2)mod9,并采用链表处理冲突,请画出元素7、4、5、3、6、2、8、9依次插入散列表的存储结构。四、算法设计题(每题10分,共30分)1.设单链表中仅有3类字符的数据元素(大写字母、数字和其他字符),要求利用原单链表中的结点空间设计出3个单链表的算法,使每个单链表只包含同类字符。import

random

import

string

class

Node:

def

__init__(self,

data=None,

nxt=None):

self.data

=

data

self.next

=

nxt

def

print_list(head):

list_data

=

[]

while

head

is

not

None:

list_data.append(head.data)

head

=

head.next

print(list_data)

head_all

=

None

tail_all

=

None

for

_

in

range(20):

node

=

Node(random.choice([

random.choice(string.ascii_uppercase),

random.choice(string.digits),

random.choice(list(set(string.printable)

-

set(string.ascii_uppercase)

-

set(string.digits))),

]))

if

tail_all

is

None:

head_all

=

tail_all

=

node

else:

tail_all.next

=

node

tail_all

=

node

print('all:

',

end='')

print_list(head_all)

head_upper

=

None

tail_upper

=

None

head_digit

=

None

tail_digit

=

None

head_other

=

None

tail_other

=

None

while

head_all

is

not

None:

node

=

head_all

head_all

=

node.next

node.next

=

None

if

node.data.isupper():

if

tail_upper

is

None:

head_upper

=

tail_upper

=

node

else:

tail_upper.next

=

node

tail_upper

=

node

elif

node.data.isdigit():

if

tail_digit

is

None:

head_digit

=

tail_digit

=

node

else:

tail_digit.next

=

node

tail_digit

=

node

else:

if

tail_other

is

None:

head_other

=

tail_other

=

node

else:

tail_other.next

=

node

tail_other

=

node

print('upper:

',

end='')

print_list(head_upper)

print('digit:

',

end='')

print_list(head_digit)

print('other:

',

end='')

print_list(head_other)

2.设计在链式存储结构上交换二叉树中所有结点左、右子树的算法。import

random

class

Node:

id_counter

=

0

def

__init__(self):

self.id

=

Node.id_counter

Node.id_counter

+=

1

self.left

=

self.right

=

None

def

print(self):

print(f'id:

{self.id},

left:

{self.left

and

self.left.id},

right:

{self.right

and

self.right.id}')

if

self.left

is

not

None:

self.left.print()

if

self.right

is

not

None:

self.right.print()

def

swap_children(self):

if

self.left

is

not

None:

self.left.swap_children()

if

self.right

is

not

None:

self.right.swap_children()

self.left,

self.right

=

self.right,

self.left

def

build_random_tree(depth=1):

node

=

Node()

if

depth

<

5:

if

bool(random.getrandbits(1)):

node.left

=

build_random_tree(depth

+

1)

if

bool(random.getrandbits(1)):

node.right

=

build_random_tree(depth

+

1)

return

node

root

=

build_random_tree()

print("original:")

root.print()

root.swap_children()

print("swapped:")

root.print()

3.在链式存储结构上建立一棵二叉排序树。import

random

class

Node:

def

__init__(self,

key):

self.key

=

key

self.left

=

self.right

=

None

def

to_list(self):

ret

=

[]

if

self.left

is

not

None:

ret.extend(self.left.to_list())

ret.append(self.key)

if

self.right

is

not

None:

ret.extend(self.right.to_list())

return

ret

def

insert(self,

key):

if

key

<

self.key:

if

self.left

is

None:

self.left

=

Node(key)

else:

self.left.insert(key)

else:

if

self.right

is

None:

self.right

=

Node(key)

else:

self.right.insert(key)

data

=

[random.randrange(0,

100)

for

_

in

range(10)]

print(f'orig:

{data}')

root

=

None

for

x

in

data:

if

root

is

None:

root

=

Node(x)

else:

root.insert(x)

print(f'bst:

{root.to_list()}')

数据结构试卷(五)一、选择题(每题2分,共20分)1.数据的最小单位是(A)。A.数据项B.数据类型C.数据元素D.数据变量2.设一组初始记录关键字序列为(50,40,95,20,15,70,60,45),则以增量d=4的一趟希尔排序结束后前4条记录关键字为(B)。A.40,50,20,95B.15,40,60,20C.15,20,40,45D.45,40,15,203.设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70),其中含有5个长度为2的有序子表,则用归并排序的方法对该记录关键字序列进行一趟归并后的结果为(A)。A.15,25,35,50,20,40,80,85,36,70B.15,25,35,50,80,20,85,40,70,36C.15,25,35,50,80,85,20,36,40,70D.15,25,35,50,80,20,36,40,70,854.函数substr("DATASTRUCTURE",5,9)的返回值为(A)。A."STRUCTURE"B."DATA"C."ASTRUCTUR"D."DATASTRUCTURE"5.设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度为(D)。A.O(log2n)B.O(1)C.O(n2)D.O(n)6.设一棵m叉树中度数为0的结点数为N0,度数为1的结点数为N1,…,度数为m的结点数为Nm,则N0=(B)。A.N1+N2+…+NmB.1+N2+2N3+3N4+…+(m-1)NmC.N2+2N3+3N4+…+(m-1)NmD.2N1+3N2+…+(m+1)Nm7.设有序表中有1000个元素,则用二分查找法查找元素X最多需要比较(B)次。A.25B.10C.7D.18.设连通图G中的边集E={(a,b),(a,e),(a,c),(b,e),(e,d),(d,f),(f,c)},则从顶点a出发可以得到一种深度优先遍历的顶点序列为(B)。A.abedfcB.acfebdC.aebdfcD.aedfcb9.设输入序列是(1,2,3,…,n),经过栈的作用后输出序列的第一个元素是n,则输出序列中的第i个输出元素是(C)。A.n-IB.n-1-IC.n+1-ID.不能确定10.设一组初始记录关键字序列为(45,80,55,40,42,85),则以第一个记录关键字45为基准得到的一趟快速排序的结果是(C)。A.40,42,45,55,80,83B.42,40,45,80,85,88C.42,40,45,55,80,85D.42,40,45,85,55,80二、填空题(除第1、2、8题2分外每空1分,共20分)1.设有一个顺序共享栈S[0:n-1],其中第一个栈顶指针top1的初值为-1,第二个栈顶指针top2的初值为n,则判断共享栈满的条件是__top1+1=top2__。2.在图的邻接表中用顺序存储结构存储表头结点的优点是_可以随机访问到任一个顶点的简单链表_。3.设有一个n阶的下三角矩阵A,如果按照行的顺序将下三角矩阵中的元素(包括对角线上的元素)存放在n(n+1)个连续的存储单元中,则A[i][j]与A[0][0]之间有_i*(i+1)/2+j-1__个数据元素。4.栈的插入和删除只能在栈的栈顶进行,后进栈的元素必定先出栈,所以又把栈称为FILO表;队列的插入和删除运算分别在队列的两端进行,先进队列的元素必定先出队列,所以又把队列称为_FIFO表。5.设一棵完全二叉树的顺序存储结构中的存储数据元素为ABCDEF,则该二叉树的前序遍历序列为_ABDECF_、中序遍历序列为_DBEAFC_、后序遍历序列为_DEBFCA_。6.设一棵完全二叉树有128个结点,则该完全二叉树的深度为_8_,有_64_个叶子结点。7.设有向图G的存储结构用邻接矩阵A来表示,则A中第i行中的所有非零元素个数之和等于顶点i的_出度_,第i列中的所有非零元素个数之和等于顶点i的_入度_。8.设一组初始记录关键字序列(k1,k2,…,kn)是堆,则对i=1、2、…、n/2而言满足的条件为_ki<=k2iandk<=k2i+1_。9.下面程序段的功能是实现冒泡排序算法,请在下画线处填上正确的语句。

1

defbubbleSort(sqlist):

2

flag=True

3

i=1

4

whilei<sqlist.lenandflag:

5

flag=False

6

forjinrange(_n-i_):

7

ifsqlist.list[j+1].key<sqlist.list[j].key:

8

p=sqlist.list[j]

9

r[j+1]=r[j]

10

sqlist.list[j+1]=p

11

flag=True

12

i+=110.下面程序段的功能是实现二分查找算法,请在下画线处填上正确的语句。

1

classrecord(object):

2

def__init__(self,key=None,other=None):

3

self.key=key

4

self.other=other

5

6

defbisearch(r,k):

7

low=0

8

high=len(r)-1

9

whilelow<=high:

10

_mid=(low+high)/2_

11

ifr[mid].key==k:

12

returnmid+1

13

elifr[mid].key>k:

14

high=mid-1

15

else:

16

low=mid+1

17

return-1三、应用题(每题8分,共32分)1.设某棵二叉树的中序遍历序列为DBEAC、前序遍历序列为ABDEC,要求给出该二叉树的后序遍历序列。答:DEBCA2.设有无向图G(如图A.7所示),给出该图的最小生成树上边的集合,并计算最小生成树各边上的权值之和。图A.7无向图G答:E={(1,5),(5,2),(5,3),(3,4)},W=10设一组初始记录关键字序列为(15,17,18,22,35,51,60),要求计算出成功查找时的平均查找长度。答:ASL=(1*1+2*2+3*4)/7=17/7;设散列表的长度为8,散列函数H(k)=kmod7,初始记录关键字序列为(25,31,8,27,13,68),要求分别计算出用线性探测法和链地址法作为解决冲突方法的平均查找长度。答:ASL1=7/6,ASL2=4/3四、算法设计题(每题14分,共28分)1.设计判断两个二叉树是否相同的算法。

1

Defjudge(nodenod1,nodenod2):

2

Ifnod1==NULLandnod2==NULL:3returnTrue;

4

Elifnod1==NULLornod2==NULLornod1.data!=nod2.data:5returnFalse;

4

Else:

5

Ifjudge(nod1.lchild,nod2.lchild)andjudge(nod1.rchild,nod2.rchild):

6

ReturnTrue;

7

Else:

8

ReturnFalse2.设计两个有序单链表的合并排序算法。

1

Defmerge(lklistl1,lklistl2):

2

lklistout=lklist()3While!l1.isempty()and!l2.isempty():

4

Ifl1.front()<l2.front():5out.append(l1.front())

4

l1.pop_front()

5

Else:

6

out.append(l2.front())

7

l2.pop_front()

8

If!l1.isempty():9Foriteminl1:10out.append(item)11

If!l2.isempty():12Foriteminl2:13out.append(item)14Returnout数据结构试卷(一)选择题(每题2分,共20分)1.栈和队列的共同特点是(A)。A.只允许在端点处插入和删除元素B.都是先进后出C.都是先进先出D.没有共同点2.用链接方式存储的队列在进行插入运算时(D)。A.仅修改头指针B.头、尾指针都要修改C.仅修改尾指针D.头、尾指针可能都要修改3.以下数据结构中(D)是非线性结构。A.队列B.栈C.线性表D.二叉树4.设有一个二维数组A[m][n],假设A[0][0]的存放位置在644(10),A[2][2]的存放位置在676(10),每个元素占一个空间,那么A[3][3](10)存放在(C)位置。脚注(10)表示用十进制表示。A.688B.678C.692D.6965.树最适合用来表示(C)。A.有序数据元素B.无序数据元素C.元素之间具有分支层次关系的数据D.元素之间无联系的数据6.二叉树的第k层的结点数最多为(D)。A.2k-1B.2K+1C.2K-1D.2k-17.若有18个元素的有序表存放在一维数组A[19]中,第一个元素放在A[1]中,现进行二分查找,则查找A[3]的比较序列的下标依次为(C)。A.1,2,3B.9,5,2,3C.9,5,3D.9,4,2,38.对n个记录的文件进行快速排序所需要的辅助存储空间大致为(D)。A.O(1)B.O(n)C.O(1og2n)D.O(n2)9.对线性表(7,34,55,25,64,46,20,10)进行散列存储时,若选用H(K)=K%9作为散列函数,则散列地址为1的元素有(C)个。A.1B.2C.3D.410.设有6个结点的无向图,该图至少应有(B)条边才能确保是一个连通图。A.5B.6C.7D.8二、填空题(每空1分,共26分)1.通常从4个方面评价算法的质量,即正确性、易读性、强壮性和高效性。2.一个算法的时间复杂度为(n3+n2log2n+14n)/n2,其数量级表示_o(n)_。3.假定一棵树的广义表表示为A(C,D(E,F,G),H(I,J)),则树中所含的结点数为9个,树的深度为3,树的度为3。4.后缀算式923+-102/-的值为-1_。中缀算式(3+4X)-2Y/3对应的后缀算式为34X*+2Y3/*-。5.若用链表存储一棵二叉树,每个结点除数据域外还有指向左孩子和右孩子的两个指针。在这种存储结构中,n个结点的二叉树共有2n个指针域,其中有n-1指针域存放了地址,有n+1个指针是空指针。6.对于一个有n个顶点和e条边的有向图和无向图,在其对应的邻接表中所含的边结点分别为e个和2e个。7.AOV网是一种没有回路的图。8.在一个有n个顶点的无向完全图中包含有_n(n-1)/2_条边,在一个有n个顶点的有向完全图中包含有_n(n-1)_条边。9.假定一个线性表为(12,23,74,55,63,40),若按key%4条件进行划分,使得同一余数的元素成为一个子表,则得到的4个子表分别为_{12,40}_、_φ_、{74}_和_{23,55,63}_。10.在向一棵B-树插入元素的过程中若最终引起树根结点的分裂,则新树比原树的高度_多1_。11.在堆排序的过程中,对任一分支结点进行筛运算的时间复杂度为_o(log2n)__,整个堆排序过程的时间复杂度为_o(nlog2n)_。12.在快速排序、堆排序、归并排序中归并排序是稳定的。三、计算题(每题6分,共24分)1.在如图A.1所示的数组A中链接存储了一个线性表,表头指针为A[0].next,试写出该线性表。图A.1数组A线性表为:A[3]->A[2]->A[7]->A[1]->A[5]->A[4]->A[0]->A[3]2.请画出图A.2所示的邻接矩阵和邻接表。图A.2无向图邻接矩阵:邻接表:1234213531245413552343.已知一个图的顶点集V和边集E如下:V={1,2,3,4,5,6,7};E={(1,2)3,(1,3)5,(1,4)8,(2,5)10,(2,3)6,(3,4)15,(3,5)12,(3,6)9,(4,6)4,(4,7)20,(5,6)18,(6,7)25};用克鲁斯卡尔算法得到最小生成树,试写出在最小生成树中依次得到的各条边。(0,3)2——(4,6)4——(0,2)5——(1,5)6——(0,1)8——(3,6)10——(5,7)20画出向小根堆中加入数据4、2、5、8、3时每加入一个数据后堆的变化。四、阅读算法(每题7分,共14分)1.

1

defmynote(L):

2

#L是不带头结点的单链表的头指针

3

ifLisnotNoneandL.nextisnotNone:

4

q=L

5

l=L.next

6

p=L

7

whilep.next:

8

p=p.next#S1

9

p.next=q

10

q.next=None

11

returnL请回答下列问题:(1)说明语句S1的功能;(2)说明语句组S2的功能;(3)设链表表示的线性表为(a1,a2,…,an),写出算法执行后的返回值所表示的线性表。答:(1)找到链表的最后一个节点。

(2)将链表的最后一个节点指向L,并将L的下一节点清空。

(3)a2,...,an,a1。2.

1

defABC(BT):

2

#BT是二叉树的结点

3

ifBTisnotNone:

4

ABC(BT.lchild)

5

ABC(BT.rchild)

6

print(BT.data,end='')该算法的功能是_打印二叉树各节点的值_。五、算法填空(共8分)二叉搜索树的查找—递归算法:

1

defFind(BST,item):

2

#BST是搜索二叉树的结点,item是查找的元素

3

ifBSTisNone:

4

returnfalse#查找失败

5

ifitem==BST.data:

6

item=BST.data#查找成功

7

returntrue

8

elifitem<BST.data:

9

returnFind(BST->left,item)

10

else:

11

returnFind(BST->right,item)六、编写算法(共8分)统计出单链表HL中结点的值等于给定值X的结点数。定义函数如下:defis_count(self,X): cur=self.__headcount=0whilecurisnotNone:ifcur.data==X: count+=1cur=cur.nextreturncount数据结构试卷(二)一、选择题(每题3分,共24分)1.下面关于线性表的叙述错误的是(D)。A.线性表采用顺序存储必须占用一片连续的存储空间B.线性表采用链式存储不必占用一片连续的存储空间C.线性表采用链式存储便于插入和删除操作的实现D.线性表采用顺序存储便于插入和删除操作的实现2.设哈夫曼树中的叶子结点总数为m,若用二叉链表作为存储结构,则该哈夫曼树中总共有(B)个空指针域。A.2m-1B.2mC.2m+1D.4m3.设顺序循环队列Q[0:M-1]的头指针和尾指针分别为F和R,头指针F总是指向队头元素的前一位置,尾指针R总是指向队尾元素的当前位置,则该循环队列中的元素个数为(C)。A.R-FB.F-RC.(R-F+M)%MD.(F-R+M)%M4.设某棵二叉树的中序遍历序列为ABCD、前序遍历序列为CABD,则后序遍历该二叉树得到的序列为(A)。A.BADCB.BCDAC.CDABD.CBDA5.设某完全无向图中有n个顶点,则该完全无向图中有(A)条边。A.n(n-1)/2B.n(n-1)C.n2D.n2-16.设某棵二叉树中有2000个结点,则该二叉树的最小高度为(C)。A.9B.10C.11D.127.设某有向图中有n个顶点,则该有向图对应的邻接表中有(B)个表头结点。A.n-1B.nC.n+1D.2n-18.设有一组初始记录关键字序列(5,2,6,3,8),以第一个记录关键字5为基准进行一趟快速排序的结果为(C)。A.2,3,5,8,6B.3,2,5,8,6C.3,2,5,6,8D.2,3,6,5,8二、填空题(每空2分,共24分)1.为了能有效地应用Hash查找技术,必须解决的两个问题是___如何构造哈希函数和如何解决冲突。2.下面程序段的功能实现数据x进栈,要求在下画线处填上正确的语句。

1

classSqStack:

2

def__init__(self):

3

self.data=[None]*100

4

self.top=0

5

#......

6

7

#......

8

9

defpush(self,x):

10

ifself.top==100:

11

raise('overflow')

12

else:

13

__self.data[top]=x____

14

___top=top+1___3.中序遍历二叉排序树所得到的序列是____有序____序列(填有序或无序)。4.快速排序的最坏时间复杂度为___O(n2)_____,平均时间复杂度为___O(nlogn)_____。5.设某棵二叉树中度数为0的结点数为N0,度数为1的结点数为N1,则该二叉树中度数为2的结点数为____N0-1___;若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有____N1+2N0____个空指针域。6.设某无向图中的顶点数和边数分别为n和e,所有顶点的度数之和为d,则e=____d/2____。7.设一组初始记录关键字序列为(55,63,44,38,75,80,31,56),则利用筛选法建立的初始堆为____大根堆:(80,75,55,56,63,44,31,38)小根堆:(31,38,44,56,75,80,55,63)____。8.已知一个有向图的邻接表存储结构如图A.3所示,从顶点1出发,DFS遍历的输出序列是_____1,3,4,5,2___,BFS遍历的输出序列是____1,3,2,4,5____。图A.3图的邻接表存储结构三、应用题(每题6分,共36分)1.设一组初始记录关键字序列为(45,80,48,40,22,78),则分别给出第4趟简单选择排序和第4趟直接插入排序后的结果。答:简单选择排序:22,40,45,48,80,78 直接插入排序:40,45,48,80,22,782.设指针变量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时的比较次数并计算出查找成功时的平均查找长度。答:比较次数2,平均查找长度25/9图A.4无向图G4.设一棵树T中边的集合为{(A,B),(A,C),(A,D),(B,E),(C,F),(C,G)},要求用孩子兄弟表示法(二叉链表)表示出该树的存储结构并将该树转化成对应的二叉树。答:5.设有如图A.4所示的无向图G,要求给出用普里姆算法构造最小生成树所走过的边的集合。答:{(1,3),(1,2),(3,5),(5,6)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论