Hello!大家好,这一篇数据结构复习题是我上个学期复习的时候写的(刚刚在草稿箱发现了!)有一些题目过程都是配了图片的,希望对正在复习数据结构的宝宝们有帮助哦!(还有一个数据结构复习题(一)可以去我的数据结构专栏中找一下!)
一、选择题
-
数据的最小单位是()。
(A)数据项
(B)数据类型
(C)数据元素
(D)数据变量 -
设一组初始记录关键字序列为(50,40,95,20,15,70,60,45),则以增量d=4的一趟希尔排序结束后前4条记录关键字为()。
(A)40,50,20,95
(B)15,40,60,20
©15,20,40,45
(D)45,40,15,20
-
设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70),其中含有5个长度为2的有序表,则用归并排序的方法对该记录关键字序列进行一趟归并排序后的结果为()。
(A)15,25,35,50,20,40,80,85,36,70
(B)15,25,35,50,80,20,85,40,70,36
©15,25,35,50,80,85,20,36,40,70
(D)15,25,35,50,80,20,36,40,70,85
【归并排序】简要步骤
①开始每个数字作为一组。
②每次都两两进行比较,直至最后一组。
-
一颗完全二叉树上有1001个结点,其中叶子结点的个数为()。
(A)250
(B)500
© 254
=(D)501
该完全二叉树的深度为10.
且第十层上的叶子结点数:1001-511=490
第九层上的叶子结点数:256-490/2=11
故总的叶子结点数:501 -
设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度为()。
(A)O(log2n)
(B)O(1)
©O(n2)
(D)O(n) -
设一棵m叉树中度数为0的结点数为No,度数为1的结点数为N1,......,度数为m的结点数为Nm,则No=()。
A) N1+N2+…+Nm
(B)I+N2+2N3+3N4+…+(m-1)Nm
© N2+2N3+3N4+…+(m-1)Nm
D)2N+3N2+…+(m+1)Nm -
设有序表中有1000个元素,则用二分查找查找元素X最多需要比较()次。
(A)25
(B)10
©7
(D)1 -
设连通图G中的边集E={(a,(e,d),(d,f),(f, c)}则从顶点a出发可以得到一种深度优先遍历的顶点序列为()。
(A)abedfc
(B)acfebd
©aebdfc
(D)aedfcb -
设输入序列是1、2、3、······、n,经过栈的作用后输出序列的第一个元素是n,则输出序列中第i个输出元素是()。
(A)n-i
(B)n-1-i
©n+1-i
(D)不能确定 -
设一组初始记录关键字序列为(45,80,55,40,42,85),则以第一个记录关键字45为基准而得到一趟快速排序的结果是()。
(A)40,42,45,55,80,83
(B)42,40,45,80,85,88
©42,40,45,55,80,85
(D)42,40,45,85,55,80
二、应用题
1.计算如图所示的AOE网中各顶点所表示的事件的发生时间ve(j),vl(j),各边所表示的活动的开始时间e(i),e(j) ,并找出其关键路径。
【基本步骤】
①计算事件的最早发生时间 Ve(i)
②计算事件的最晚发生时间 Vl(i)
③计算活动的最早发生时间 e(i)
④计算活动的最晚发生时间 l(i)
⑤计算活动的时间余量 l(i)-e(i)
⑥写出关键路径
如图所示:
写出图的拓扑排序,并计算事件也就是顶点的最早和最晚发生时间
(写成图表的形式 等一会算活动的最晚发生时间看着比较直观)
计算活动的最早最晚发生时间
根据时间余量 写出关键路径
三、算法设计题
1.设计判断两个二叉树是否相同的算法。
typedef char datatype;
typedef struct node
{datatype data;struct node *lchild;struct node *rchild;
}bitree;
int judgebitree(bitree* t1,bitree *t2)
{if(t1==NULL && t2==NULL )return 1;else if (t1==NULL || t2==NULL)return 0;else if (t1->data!=t2->data)return 0;else//我觉得这个*就很妙return (judgebitree(t1->lchild,t2->lchild)*judgebitree(t1->rchild,t2->rchild));
}
3.非递归实现二叉树的前序遍历和中序遍历。
先定义好顺序栈。
typedef struct stack
{bintree data[100];int top;
}seqstack;//进栈void push(seqstack *s,bintree t){s->data[s->top]=t;s->top++;}//出栈bintree (seqstack *s){if(s->top!=0){s->top--;return (s->data[s->top];)}elsereturn NULL;}
二叉树前序遍历的非递归实现
//bintree是指向二叉树结点的指针
//typedef bintnode * bintree;
void preorder (bintree t)
{seqstack s;s.top=0;while((t) || (s.top)!=0){if (t){printf("%c",t->data);push(&s,t);t=t->child;}else{t=pop(&s);t=t->rchild;}}
}
二叉树中序遍历的非递归实现
void inorder(bintree)
{seqstack s;s.top=0;while(t!=NULL || (s.top!=0)){if(t){push($s,t);t=t->lchld;}else{t=pop(&s);printf("%c",t->data);t=t->rchild;}}
}