当前位置:文档之家› (完整版)数据结构复习题(附答案)

(完整版)数据结构复习题(附答案)

一、算法设计题(每题15分,共60分)

答题要求:

①用自然语言说明所采用算法的思想;

②给出每个算法所需的数据结构定义,并做必要说明;

③写出对应的算法程序,并做必要的注释。

1、有一个带头结点的单链表,每个结点包括两个域,一个是整型域info,另一个是指向下一个结点的指针域next。假设单链表已建立,设计算法删除单链表中所有重复出现的结点,使得info域相等的结点只保留一个。

3、约瑟夫环问题(Josephus问题)是指编号为1、2、…,n的n(n>0)个人按顺时针方向围坐成一圈,现从第s个人开始按顺时针方向报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列,…,如此重复直到所有的人全部出列为止。现要求采用循环链表结构设计一个算法,模拟此过程。

4、编程实现单链表的就地逆置。

23.在数组 A[1..n]中有n个数据,试建立一个带有头结点的循环链表,头指针为h,要求链中数据从小到大排列,重复的数据在链中只保存一个.

5、设计一个尽可能的高效算法输出单链表的倒数第K个元素。

3、假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序列。(15分)

(1)下面所示的序列中哪些是合法的?

A. IOIIOIOO

B. IOOIOIIO

C. IIIOIOIO

D. IIIOOIOO

(2)通过对(1)的分析,写出一个算法,判定所给的操作序列是否合法。若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中)。

5、设从键盘输入一整数的序列:a1, a2, a3,…,an,试编写算法实现:用栈结构存储输入的整数,当ai≠-1时,将ai进栈;当ai=-1时,输出栈顶整数并出栈。算法应对异常情况(入栈满等)给出相应的信息。

设有一个背包可以放入的物品重量为S,现有n件物品,重量分别为W1,W2,...,W n。问能否从这n件物品中选择若干件放入背包,使得放入的重量之和正好是S。设布尔函数Knap(S,n)表示背包问题的解,W i(i=1,2,...,n)均为正整数,并已顺序存储地在数组W中。请在下列算法的下划线处填空,使其正确求解背包问题。

Knap(S,n)

若S=0

则Knap←true

否则若(S<0)或(S>0且n<1)

则Knap←false

否则若Knap(1) , _=true

则print(W[n]);Knap ←true

否则 Knap←Knap(2) _ , _

设有一个顺序栈S,元素s1, s2, s3, s4, s5, s6依次进栈,如果6个元素的出栈顺序为s2, s3, s4,

s6, s5, s1,则顺序栈的容量至少应为多少?画出具体进栈、出栈过程。

假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀存储空间。例如:

设str1和str2是分别指向两个单词的头结点,请设计一个尽可能的高效算法,找出两个单词共同后缀的起始位置,分析算法时间复杂度。

将n(n>1)个整数存放到一维数组R中。设计一个尽可能高效(时间、空间)的算

法,将R中保存的序列循环左移p(0

4.编写一个过程,对一个n×n矩阵,通过行变换,使其每行元素的平均值按递增顺序排列。

7.给定一个整数数组b[0..N-1],b中连续的相等元素构成的子序列称为平台。试设计算法,求出b中最长平台的长度。【

8. 给定nxm矩阵A[a..b,c..d],并设A[i,j]≤A[i,j+1](a≤i≤b,c≤j≤d-1)和A[i,j]≤A[i+1,j](a≤i≤b-1,c≤j≤d).设计一算法判定X的值是否在A中,要求时间复杂度为O(m+n)。【

22. 给定有m个整数的递增有序数组a[1..m]和有n个整数的递减有序数组b[1..n],试写出算法:将数组a和b归并为递增有序数组c[l..m+n]。(要求:算法的时间复杂度为O(m+n))

4、要求二叉树按二叉链表形式存储,(15分)

(1)写一个建立二叉树的算法。(2)写一个判别给定的二叉树是否是完全二叉树的算法。

3、已知一棵二叉树的中序遍历结果为:DBFEAGHCI,后序遍历结果为:DFEBHGICA。(1)画出这棵二叉树,并写出它的前序遍历结果;

(2)将这棵二叉树转换成等价的森林或树。

24.将二叉树bt中每一个结点的左右子树互换的C语言算法如下,其中ADDQ(Q,bt),DELQ(Q),EMPTY(Q)分别为进队,出队和判别队列是否为空的函数,请填写算法中得空白处,完成其功能。

typedef struct node

{int data ; struct node *lchild, *rchild; }btnode;

void EXCHANGE(btnode *bt)

{btnode *p, *q;

if (bt){ADDQ(Q,bt);

while(!EMPTY(Q))

{p=DELQ(Q); q=(1)___; p->rchild=(2)___; (3)___=q;

if(p->lchild) (4)___; if(p->rchild) (5)___;

}

} }

25.设t是给定的一棵二叉树,下面的递归程序count(t)用于求得:二叉树t中具有非空的左,右两个儿子的结点个数N2;只有非空左儿子的个数NL;只有非空右儿子的结点个数NR和叶子结点个数N0。N2、NL、NR、N0都是全局量,且在调用count(t)之前都置为0. typedef struct node

{int data; struct node *lchild,*rchild;}node;

int N2,NL,NR,N0;

void count(node *t)

{if (t->lchild!=NULL) if (1)___ N2++; else NL++;

else if (2)___ NR++; else (3)__ ;

if(t->lchild!=NULL)(4)____; if (t->rchild!=NULL) (5)____;

}

26.树的先序非递归算法。

void example(b)

btree *b;

{ btree *stack[20], *p;

int top;

if (b!=null)

{ top=1; stack[top]=b;

while (top>0)

{ p=stack[top]; top--;

printf(“%d”,p->data);

if (p->rchild!=null)

{(1)___; (2)___;

}

if (p->lchild!=null)

(3)___; (4)__;

}}}}

27.由二叉树的前序遍历和中序遍历序列能确定唯一的一棵二叉树,下面程序的作用是实现由已知某二叉树的前序遍历和中序遍历序列,生成一棵用二叉链表表示的二叉树并打印出后序遍历序列,请写出程序所缺的语句。

#define MAX 100

typedef struct Node

{char info; struct Node *llink, *rlink; }TNODE;

char pred[MAX],inod[MAX];

main(int argc,int **argv)

{ TNODE *root;

if(argc<3) exit 0;

strcpy(pred,argv[1]); strcpy(inod,argv[2]);

root=restore(pred,inod,strlen(pred));

postorder(root);

}

TNODE *restore(char *ppos,char *ipos,int n)

{ TNODE *ptr; char *rpos; int k;

if(n<=0) return NULL;

ptr->info=(1)_______;

for((2)_______ ; rpos

k=(3)_______;

ptr->llink=restore(ppos+1, (4)_______,k );

ptr->rlink=restore ((5)_______+k,rpos+1,n-1-k);

return ptr;

}

postorder(TNODE*ptr)

{ if(ptr=NULL) return;

postorder(ptr->llink); postorder(ptr->rlink); printf(“%c”,ptr->info);

}

28.证明由二叉树的中序序列和后序序列,也可以唯一确定一棵二叉树。

29. ①试找出满足下列条件的二叉树

1)先序序列与后序序列相同 2)中序序列与后序序列相同

3)先序序列与中序序列相同 4)中序序列与层次遍历序列相同

30.设一棵二叉树的结点结构为 (LLINK,INFO,RLINK),ROOT为指向该二叉树根结点的指针,p和q分别为指向该二叉树中任意两个结点的指针,试编写一算法ANCESTOR(ROOT,p,q,r),该算法找到p和q的最近共同祖先结点r。

31. 设T是一棵满二叉树,编写一个将T的先序遍历序列转换为后序遍历序列的递归算法。

32. 请设计一个算法,要求该算法把二叉树的叶子结点按从左到右的顺序连成一个单链表,表头指针为head。二叉树按二叉链表方式存储,链接时用叶子结点的右指针域来存放单链表指针。分析你的算法的时、空复杂度。

33. 设两棵二叉树的的根结点地址分别为p和q,采用二叉链表的形式存储这两棵树上所有的结点。请编写程序,判断它们是否相似。

34. 一棵二叉树以二叉链表来表示,求其指定的某一层k(k>1)上的叶子结点的个数。

35.二叉树T的中序遍历序列和层次遍历序列分别是BAFDGCE和ABCDEFG,试画出该二叉树,并写出由二叉树的中序遍历序列和层次遍历序列确定二叉树的算法。

36.设二叉树的结点结构是(Lc,data,Rc),其中Lc、Rc分别为指向左、右子树根的指针,data是字符型数据。试写出算法,求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。

2、假设以邻接矩阵作为图的存储结构,编写算法判别在给定的有向图中是否存在一个简单有向回路,若存在,则以顶点序列的方式输出该回路(找到一条即可)。(注:图中不存在顶

图1 连通网G

点到自己的弧)

5、给定n 个村庄之间的交通图,若村庄i 和j 之间有道路,则将顶点i 和j 用边连接,边上的Wij 表示这条道路的长度,现在要从这n 个村庄中选择一个村庄建一所医院,问这所医院应建在哪个村庄,才能使离医院最远的村庄到医院的路程最短?试设计一个解答上述问题的算法,并应用该算法解答如图所示的实例。(20分)

1、对图1所示的连通网G ,请用Prim 算法构造其最小生成树(每选取一条边画一个图)。

4、已知有向图G=(V,E),其中V={V 1,V 2,V 3,V 4,V 5,V 6,V 7},

E={,,,,,,,,}

写出G 的拓扑排序的结果。

37.在有向图G 中,如果r 到G 中的每个结点都有路径可达,则称结点r 为G 的根结点。编写一个算法完成下列功能:

(1).建立有向图G 的邻接表存储结构;

(2).判断有向图G 是否有根,若有,则打印出所有根结点的值。

38.二部图(bipartite graph ) G=(V ,E )是一个能将其结点集V 分为两不相交子集V 1和V2=V-V1的无向图,使得:V1中的任何两个结点在图G 中均不相邻,V2中的任何结点在图G 中也均不相邻。

(1).请各举一个结点个数为5的二部图和非二部图的例子。

(2).请用C 或PASCAL 编写一个函数BIPARTITE 判断一个连通无向图G 是否是二部图,并分析程序的时间复杂度。设G 用二维数组A 来表示,大小为n*n (n 为结点个数)。请在程序中加必要的注释。若有必要可直接利用堆栈或队列操作。【

39.我们可用“破圈法”求解带权连通无向图的一棵最小代价生成树。所谓“破圈法”就是“任取一圈,去掉圈上权最大的边”,反复执行这一步骤,直到没有圈为止。请给出用“破圈法”求解给定的带权连通无向图的一棵最小代价生成树的详细算法,并用程序实现你所给出的算法。注:圈就是回路。

40. 请编写一个判别给定二叉树是否为二叉排序树的算法,设二叉树用llink-rlink 法存1 2

5 6 3 4

2

2

3 6 10

4 4 6 9 12 7

储。

41. 假设K1,…,Kn是n个关键词,试解答:

试用二叉查找树的插入算法建立一棵二叉查找树,即当关键词的插入次序为K1,K2,…,Kn时,用算法建立一棵以LLINK / RLINK 链接表示的二叉查找树。

42.给出折半查找的递归算法,并给出算法时间复杂度性分析。

43. 写出从哈希表中删除关键字为K的一个记录的算法,设哈希函数为H,解决冲突的方法为链地址法。

44. 在用除余法作为散列函数、线性探测解决冲突的散列表中,写一删除关键字的算法,要求将所有可以前移的元素前移去填充被删除的空位,以保证探测序列不致于断裂。

45. 假设一棵平衡二叉树的每个结点都标明了平衡因子b,试设计一个算法,求平衡二叉树的高度。

46. 有一个100*100的稀疏矩阵,其中1%的元素为非零元素,现要求用哈希表作存储结构。

(1)请你设计一个哈希表

(2)请写一个对你所设计的哈希表中给定行值和列值存取矩阵元素的算法;并对你的算法所需时间和用一维数组(每个分量存放一个非零元素的行值,列值,和元素值)作存储结构时存取元素的算法.

2、画出向小顶堆中加入数据4, 2, 5, 8, 3, 6, 10, 1时,每加入一个数据后堆的变化。

47. 冒泡排序算法是把大的元素向上移(气泡的上浮),也可以把小的元素向下移(气泡的下沉)请给出上浮和下沉过程交替的冒泡排序算法。

48.有n个记录存储在带头结点的双向链表中,现用双向起泡排序法对其按上升序进行排序,请写出这种排序的算法。(注:双向起泡排序即相邻两趟排序向相反方向起泡)

49. 6.有一种简单的排序算法,叫做计数排序(count sorting)。这种排序算法对一个待排序的表(用数组表示)进行排序,并将排序结果存放到另一个新的表中。必须注意的是,表中所有待排序的关键码互不相同,计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键码比该记录的关键码小,假设针对某一个记录,统计出的计数值为c,那么,这个记录在新的有序表中的合适的存放位置即为c。

(1) (3分)给出适用于计数排序的数据表定义;

(2) (7分)使用Pascal或C语言编写实现计数排序的算法;

(3) (4分)对于有n个记录的表,关键码比较次数是多少?

(4) (3分)与简单选择排序相比较,这种方法是否更好?为什么?

50. 9.设有一个数组中存放了一个无序的关键序列K1、K2、…、Kn。现要求将Kn放在将元素排序后的正确位置上,试编写实现该功能的算法,要求比较关键字的次数不超过n。51. 借助于快速排序的算法思想,在一组无序的记录中查找给定关键字值等于key的记录。设此组记录存放于数组r[l..h]中。若查找成功,则输出该记录在r数组中的位置及其值,否则显示“not find”信息。请编写出算法并简要说明算法思想。

52. 二路插入排序是将待排关键字序列r[1..n]中关键字分二路分别按序插入到辅助向量d[1..n]前半部和后半部(注:向量d可视为循环表),其原则为,先将r[l]赋给d[1],再从r[2] 记录开始分二路插入。编写实现二路插入排序算法。

二、算法设计题(每题15分,共60分)

1、有一个带头结点的单链表,每个结点包括两个域,一个是整型域info,另一个是指向下一个结点的指针域next。假设单链表已建立,设计算法删除单链表中所有重复出现的结点,使得info域相等的结点只保留一个。

#include

typedef char datatype;

typedef struct node{

datatype data;

struct node * next;

} listnode;

typedef listnode* linklist;

/*--------------------------------------------*/

/* 删除单链表中重复的结点*/

/*--------------------------------------------*/

linklist deletelist(linklist head)

{ listnode *p,*s,*q;

p=head->next;

while(p)

{s=p;

q=p->next;

while(q)

if(q->data==p->data)

{s->next=q->next;free(q);

q=s->next;}

else

{ s=q; /*找与P结点值相同的结点*/

q=q->next;

}

p=p->next;

}

return head;

}

3、约瑟夫环问题(Josephus问题)是指编号为1、2、…,n的n(n>0)个人按顺时针方向围坐成一圈,现从第s个人开始按顺时针方向报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列,…,如此重复直到所有的人全部出列为止。现要求采用循环链表结构设计一个算法,模拟此过程。

#include

typedef int datatype;

typedef struct node

{datatype data;

struct node *next;

}listnode;

typedef listnode *linklist;

void jose(linklist head,int s,int m)

{linklist k1,pre,p;

int count=1;

pre=NULL;

k1=head; /*k1为报数的起点*/

while (count!=s) /*找初始报数起点*/

{pre=k1;

k1=k1->next;

count++;

}

while(k1->next!=k1) /*当循环链表中的结点个数大于1时*/ { p=k1; /*从k1开始报数*/

count=1;

while (count!=m) /*连续数m个结点*/

{ pre=p;

p=p->next;

count++;

}

pre->next=p->next; /*输出该结点,并删除该结点*/

printf("%4d",p->data);

free(p);

k1=pre->next; /*新的报数起点*/

}

printf("%4d",k1->data); /*输出最后一个结点*/

free(k1);

}

main()

{linklist head,p,r;

int n,s,m,i;

printf("n=");

scanf("%d",&n);

printf("s=");

scanf("%d",&s);

printf("m=",&m);

scanf("%d",&m);

if (n<1) printf("n<0");

else

{/*建表*/

head=(linklist)malloc(sizeof(listnode)); /*建第一个结点*/

head->data=n;

r=head;

for (i=n-1;i>0;i--) /*建立剩余n-1个结点*/

{ p=(linklist)malloc(sizeof(listnode));

p->data=i;

p->next=head;

head=p;

}

r->next=head; /*生成循环链表*/

jose(head,s,m); /*调用函数*/

}

}

4、void LinkList_reverse(Linklist &L)

//链表的就地逆置;为简化算法,假设表长大于2

{

p=L->next;q=p->next;s=q->next;p->next=NULL;

while(s->next)

{

q->next=p;p=q;

q=s;s=s->next; //把L的元素逐个插入新表表头

}

q->next=p;s->next=q;L->next=s;

}//LinkList_reverse

23、[题目分析]本题要求建立有序的循环链表。从头到尾扫描数组A,取出A[i](0<=i

LinkedList creat(ElemType A[],int n)

//由含n个数据的数组A生成循环链表,要求链表有序并且无值重复结点

{LinkedList h;

h=(LinkedList)malloc(sizeof(LNode));//申请结点

h->next=h; //形成空循环链表

for(i=0;i

{pre=h;

p=h->next;

while(p!=h && p->data

{pre=p; p=p->next;} //查找A[i]的插入位置

if(p==h || p->data!=A[i]) //重复数据不再输入 {s=(LinkedList)malloc(sizeof(LNode));

s->data=A[i]; pre->next=s; s->next=p;//将结点s链入链表中

}

}//for

return(h);

}算法结束

3、假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序列。(15分)

(1)A和D是合法序列,B和C 是非法序列。

(2)设被判定的操作序列已存入一维数组A中。

int Judge(char A[])

//判断字符数组A中的输入输出序列是否是合法序列。如是,返回true,否则返回false。

{i=0; //i为下标。

j=k=0; //j和k分别为I和字母O的的个数。

while(A[i]!=‘\0’) //当未到字符数组尾就作。

{switch(A[i])

{case‘I’: j++; break; //入栈次数增1。

case‘O’: k++; if(k>j){printf(“序列非法\n”);exit(0);}

}

i++; //不论A[i]是‘I’或‘O’,指针i均后移。}

if(j!=k) {printf(“序列非法\n”);return(false);}

else {printf(“序列合法\n”);return(true);}

}//算法结束。

5.#define maxsize 栈空间容量

void InOutS(int s[maxsize])

//s是元素为整数的栈,本算法进行入栈和退栈操作。

{int top=0; //top为栈顶指针,定义top=0时为栈空。

for(i=1; i<=n; i++) //n个整数序列作处理。

{scanf(“%d”,&x); //从键盘读入整数序列。

if(x!=-1) // 读入的整数不等于-1时入栈。

if(top==maxsize-1){printf(“栈满\n”);exit(0);}

else s[++top]=x; //x入栈。

else //读入的整数等于-1时退栈。

{if(top==0){printf(“栈空\n”);exit(0);}

else printf(“出栈元素是%d\n”,s[top--]);} }

}//算法结束。

若第n件物品能放入背包,则问题变为能否再从n-1件物品中选出若干件放入背包(这时背包可放入物品的重量变为s-w[n])。若第n件物品不能放入背包,则考虑从n-1件物品选若干件放入背包(这时背包可放入物品仍为s)。若最终s=0,则有一解;否则,若s<0或虽然s>0但物品数n<1,则无解。

(1)s-w[n],n-1 //Knap(s-w[n],n-1)=true

(2)s,n-1 // Knap←Knap(s,n-1)

3

①分别求出str1、str2的长度m、n

②将两个链表的表尾对齐。p、q两个指针。

③p、q两个指针同步移动,直到指向相同结点。

先将n个数据(前后对应交换)原地逆置,然后再将前n-p和后p个分别原地逆置。

Void reverse(int r[], int left, int right)

{

int k=left, j=right, temp;

while (k

{

temp=r[k]; r[k]=r[j]; r[j]=temp; k++;j--;

}

}

Void leftshift(int r[], int n, int p)

{

if(p>0&&p

{ reverse(r,0,n-1);reverse(r,0,n-p-1);reverse(r,n-p,n-1);}

}

4. [题目分析]题目中要求矩阵两行元素的平均值按递增顺序排序,由于每行元素个数相等,按平均值排列与按每行元素之和排列是一个意思。所以应先求出各行元素之和,放入一维数组中,然后选择一种排序方法,对该数组进行排序,注意在排序时若有元素移动,则与之相应的行中各元素也必须做相应变动。

void Translation(float *matrix,int n)

//本算法对n×n的矩阵matrix,通过行变换,使其各行元素的平均值按递增排列。

{int i,j,k,l;

float sum,min; //sum暂存各行元素之和

float *p, *pi, *pk;

for(i=0; i

{sum=0.0; pk=matrix+i*n; //p k指向矩阵各行第1个元素.

for (j=0; j

*(p+i)=sum; //将一行元素之和存入一维数组.

}//for i

for(i=0; i

{min=*(p+i); k=i; //初始设第i行元素之和最小.

for(j=i+1;j

if(i!=k) //若最小行不是当前行,要进行交换(行元素及行元素之和)

{pk=matrix+n*k; //pk指向第k行第1个元素.

pi=matrix+n*i; //pi指向第i行第1个元素.

for(j=0;j

{sum=*(pk+j); *(pk+j)=*(pi+j); *(pi+j)=sum;}

sum=p[i]; p[i]=p[k]; p[k]=sum; //交换一维数组中元素之和.

}//if

}//for i

free(p); //释放p数组.

}// Translation

[算法分析] 算法中使用选择法排序,比较次数较多,但数据交换(移动)较少.若用其它排序方法,虽可减少比较次数,但数据移动会增多.算法时间复杂度为O(n2).

7.[题目分析]我们用l代表最长平台的长度,用k指示最长平台在数组b中的起始位置(下标)。用j记住局部平台的起始位置,用i指示扫描b数组的下标,i从0开始,依次和后续元素比较,若局部平台长度(i-j)大于l时,则修改最长平台的长度k(l=i-j)和其在b中的起始位置(k=j),直到b数组结束,l即为所求。

void Platform (int b[ ], int N)

//求具有N个元素的整型数组b中最长平台的长度。

{l=1;k=0;j=0;i=0;

while(i

{while(i

if(i-j+1>l) {l=i-j+1;k=j;} //局部最长平台

i++; j=i; } //新平台起点

printf(“最长平台长度%d,在b数组中起始下标为%d”,l,k);

}// Platform

8.[题目分析]矩阵中元素按行和按列都已排序,要求查找时间复杂度为O(m+n),因此不能采用常规的二层循环的查找。可以先从右上角(i=a,j=d)元素与x比较,只有三种情况:一是A[i,j]>x,这情况下向j 小的方向继续查找;二是A[i,j]

void search(datatype A[ ][ ], int a,b,c,d, datatype x)

//n*m矩阵A,行下标从a到b,列下标从c到d,本算法查找x是否在矩阵A中.

{i=a; j=d; flag=0; //flag是成功查到x的标志

while(i<=b && j>=c)

if(A[i][j]==x) {flag=1;break;}

else if (A[i][j]>x) j--; else i++;

if(flag) printf(“A[%d][%d]=%d”,i,j,x); //假定x为整型.

else printf(“矩阵A中无%d 元素”,x);

}算法search结束。

[算法讨论]算法中查找x的路线从右上角开始,向下(当x>A[i,j])或向左(当x

比较m+n次,故算法最差时间复杂度是O(m+n)。

22、[题目分析]数组A和B的元素分别有序,欲将两数组合并到C数组,使C仍有序,应将A和B拷贝到C,只要注意A和B数组指针的使用,以及正确处理一数组读完数据后将另一数组余下元素复制到C中即可。

void union(int A[],B[],C[],m,n)

//整型数组A和B各有m和n个元素,前者递增有序,后者递减有序,本算法将A和B 归并为递增有序的数组C。

{i=0; j=n-1; k=0;// i,j,k分别是数组A,B和C的下标,因用C描述,下标从0开始

while(i=0)

if(a[i]

while(i

while(j>=0) c[k++]=b[j--];

}算法结束

4、要求二叉树按二叉链表形式存储。15分

(1)写一个建立二叉树的算法。(2)写一个判别给定的二叉树是否是完全二叉树的算法。

BiTree Creat() //建立二叉树的二叉链表形式的存储结构

{ElemType x;BiTree bt;

scanf(“%d”,&x); //本题假定结点数据域为整型

if(x==0) bt=null;

else if(x>0)

{bt=(BiNode *)malloc(sizeof(BiNode));

bt->data=x; bt->lchild=creat(); bt->rchild=creat();

}

else error(“输入错误”);

return(bt);

}//结束 BiTree

int JudgeComplete(BiTree bt) //判断二叉树是否是完全二叉树,如是,返回1,否则,返回0

{int tag=0; BiTree p=bt, Q[]; // Q是队列,元素是二叉树结点指针,容量足够大

if(p==null) return (1);

QueueInit(Q); QueueIn(Q,p); //初始化队列,根结点指针入队

while (!QueueEmpty(Q))

{p=QueueOut(Q); //出队

if (p->lchild && !tag) QueueIn(Q,p->lchild); //左子女入队

else {if (p->lchild) return 0; //前边已有结点为空,本结点不空

else tag=1; //首次出现结点为空if (p->rchild && !tag) QueueIn(Q,p->rchild); //右子女入队

else if (p->rchild) return 0; else tag=1;

} //while

return 1; } //JudgeComplete

3、已知一棵二叉树的中序遍历结果为:DBFEAGHCI,后序遍历结果为:DFEBHGICA。

(1)画出这棵二叉树,并写出它的前序遍历结果;

(2)将这棵二叉树转换成等价的森林或树。

前序遍历结果为:ABDEFCGHI

24. (1)p->rchild (2)p->lchild (3)p->lchild (4)ADDQ(Q,p->lchild)

(5)ADDQ(Q,p->rchild)

25. (1)t->rchild!=null (2)t->rchild!=null (3)N0++ (4)count(t->lchild)

(5)count(t->rchild)

26. .(1)top++ (2) stack[top]=p->rchild (3)top++

(4)stack[top]=p->lchild

27. (1)*ppos // 根结点(2)rpos=ipos (3)rpos–ipos (4)ipos

(5)ppos+1

28. 证明由二叉树的中序序列和后序序列,也可以唯一确定一棵二叉树。

当n=1时,只有一个根结点,由中序序列和后序序列可以确定这棵二叉树。

设当n=m-1时结论成立,现证明当n=m时结论成立。

设中序序列为S1,S2,…,Sm,后序序列是P1,P2,…,Pm。因后序序列最后一个元素

Pm是根,则在中序序列中可找到与Pm相等的结点(设二叉树中各结点互不相同)Si(1≤i

≤m),因中序序列是由中序遍历而得,所以Si是根结点,S1,S2,…,Si-1是左子树的中

序序列,而Si+1,Si+2,…,Sm是右子树的中序序列。

若i=1,则S1是根,这时二叉树的左子树为空,右子树的结点数是m-1,则{S2,S3,…,Sm}和{P1,P2,…,Pm-1}可以唯一确定右子树,从而也确定了二叉树。

若i=m,则Sm是根,这时二叉树的右子树为空,左子树的结点数是m-1,则{S1,S2,…,

Sm-1}和{P1,P2,…,Pm-1}唯一确定左子树,从而也确定了二叉树。

最后,当1

由于后序遍历是“左子树—右子树—根结点”,所以{P1,P2,…,Pi-1}和{Pi,Pi+1,…Pm-1}

是二叉树的左子树和右子树的后序遍历序列。因而由{S1,S2,…,Si-1}和{P1,P2,…,

Pi-1}

可唯一确定二叉树的左子树,由{Si+1,Si+2,…,Sm}和

{Pi,Pi+1,…,Pm-1}可唯一确定二叉树的右子树。

29.原则,本题解答如下:

(1)若先序序列与后序序列相同,则或为空树,或为只有根结点的二叉树

(2)若中序序列与后序序列相同,则或为空树,或为任一结点至多只有左子树的二叉树.(3)若先序序列与中序序列相同,则或为空树,或为任一结点至多只有右子树的二叉树.

(4)若中序序列与层次遍历序列相同,则或为空树,或为任一结点至多只有右子树的二叉树。

30. .[题目分析]后序遍历最后访问根结点,即在递归算法中,根是压在栈底的。采用后序非递归算法,栈中存放二叉树结点的指针,当访问到某结点时,栈中所有元素均为该结点的祖先。本题要找p和q 的最近共同祖先结点r ,不失一般性,设p在q的左边。后序遍历必然先遍历到结点p,栈中元素均为p的祖先。将栈拷入另一辅助栈中。再继续遍历到结点q时,将栈中元素从栈顶开始逐个到辅助栈中去匹配,第一个匹配(即相等)的元素就是结点p 和q的最近公共祖先。

typedef struct

{BiTree t;int tag;//tag=0 表示结点的左子女已被访问,tag=1表示结点的右子女已被访问

}stack;

stack s[],s1[];//栈,容量够大

BiTree Ancestor(BiTree ROOT,p,q,r)//求二叉树上结点p和q的最近的共同祖先结点r。{top=0; bt=ROOT;

while(bt!=null ||top>0)

{while(bt!=null && bt!=p && bt!=q) //结点入栈

{s[++top].t=bt; s[top].tag=0; bt=bt->lchild;} //沿左分枝向下

if(bt==p) //不失一般性,假定p在q的左侧,遇结点p时,栈中元素均为p的祖先结点

{for(i=1;i<=top;i++) s1[i]=s[i]; top1=top; }//将栈s的元素转入辅助栈s1 保存

if(bt==q) //找到q 结点。

for(i=top;i>0;i--)//;将栈中元素的树结点到s1去匹配

{pp=s[i].t;

for (j=top1;j>0;j--)

if(s1[j].t==pp) {printf(“p 和q的最近共同的祖先已找到”);return(pp);} }

while(top!=0 && s[top].tag==1) top--; //退栈

if (top!=0){s[top].tag=1;bt=s[top].t->rchild;} //沿右分枝向下遍历

}//结束while(bt!=null ||top>0)

return(null);//q、p无公共祖先

}//结束Ancestor

31. .[题目分析]对一般二叉树,仅根据一个先序、中序、后序遍历,不能确定另一个遍历序列。但对于满二叉树,任一结点的左右子树均含有数量相等的结点,根据此性质,可将任一遍历序列转为另一遍历序列(即任一遍历序列均可确定一棵二叉树)。

void PreToPost(ElemType pre[] ,post[],int l1,h1,l2,h2)

//将满二叉树的先序序列转为后序序列,l1,h1,l2,h2是序列初始和最后结点的下标。

{if(h1>=l1)

{post[h2]=pre[l1]; //根结点

half=(h1-l1)/2; //左或右子树的结点数

PreToPost(pre,post,l1+1,l1+half,l2,l2+half-1) //将左子树先序序列转为

后序序列

PreToPost(pre,post,l1+half+1,h1,l2+half,h2-1) //将右子树先序序列转为后序序列

} }//PreToPost

32. .[题目分析]叶子结点只有在遍历中才能知道,这里使用中序递归遍历。设置前驱结点指针pre,初始为空。第一个叶子结点由指针head指向,遍历到叶子结点时,就将它前驱的rchild指针指向它,最后叶子结点的rchild为空。

LinkedList head,pre=null; //全局变量

LinkedList InOrder(BiTree bt)

//中序遍历二叉树bt,将叶子结点从左到右链成一个单链表,表头指针为head

{if(bt){InOrder(bt->lchild); //中序遍历左子树

if(bt->lchild==null && bt->rchild==null) //叶子结点

if(pre==null) {head=bt; pre=bt;} //处理第一个叶子结点

else{pre->rchild=bt; pre=bt; } //将叶子结点链入链表 InOrder(bt->rchild); //中序遍历左子树

pre->rchild=null; //设置链表尾

}

return(head); } //InOrder

时间复杂度为O(n),辅助变量使用head和pre,栈空间复杂度O(n)

33.[题目分析]两棵空二叉树或仅有根结点的二叉树相似;对非空二叉树,可判左右子树是否相似,采用递归算法。

int Similar(BiTree p,q) //判断二叉树p和q是否相似

{if(p==null && q==null) return (1);

else if(!p && q || p && !q) return (0);

else return(Similar(p->lchild,q->lchild) && Similar(p->rchild,q->rchild))

}//结束Similar

34. .[题目分析]对二叉树的某层上的结点进行运算,采用队列结构按层次遍历最适宜。

int LeafKlevel(BiTree bt, int k) //求二叉树bt 的第k(k>1) 层上叶子结点个数{if(bt==null || k<1) return(0);

BiTree p=bt,Q[]; //Q是队列,元素是二叉树结点指针,容量足够大

int front=0,rear=1,leaf=0; //front 和rear是队头和队尾指针, leaf是叶子结点数

int last=1,level=1; Q[1]=p; //last是二叉树同层最右结点的指针,level 是二叉树的层数

while(front<=rear)

{p=Q[++front];

if(level==k && !p->lchild && !p->rchild) leaf++; //叶子结点

if(p->lchild) Q[++rear]=p->lchild; //左子女入队

if(p->rchild) Q[++rear]=p->rchild; //右子女入队

if(front==last) {level++; //二叉树同层最右结点已处理,层数增1 last=rear; } //last移到指向下层最右一元素

if(level>k) return (leaf); //层数大于k 后退出运行

}//while }//结束LeafKLevel

35. .[题目分析] 二叉树的层次遍历序列的第一个结点是二叉树的根。实际上,层次遍历序列中的每个结点都是“局部根”。确定根后,到二叉树的中序序列中,查到该结点,该结点将二叉树分为“左根右”三部分。若左、右子树均有,则层次序列根结点的后面应是左右子树的根;若中序序列中只有左子树或只有右子树,则在层次序列的根结点后也只有左子树的根或右子树的根。这样,定义一个全局变量指针R,指向层次序列待处理元素。算法中先处理根结点,将根结点和左右子女的信息入队列。然后,在队列不空的条件下,循环处理二叉树的结点。队列中元素的数据结构定义如下:

typedef struct

{ int lvl; //层次序列指针,总是指向当前“根结点”在层次序列中的位置

int l,h; //中序序列的下上界

int f; //层次序列中当前“根结点”的双亲结点的指针

int lr; // 1—双亲的左子树 2—双亲的右子树

}qnode;

BiTree Creat(datatype in[],level[],int n)

//由二叉树的层次序列level[n]和中序序列in[n]生成二叉树。 n是二叉树的结点数{if (n<1) {printf(“参数错误\n”); exit(0);}

qnode s,Q[]; //Q是元素为qnode类型的队列,容量足够大

init(Q); int R=0; //R是层次序列指针,指向当前待处理的结点

BiTree p=(BiTree)malloc(sizeof(BiNode)); //生成根结点

p->data=level[0]; p->lchild=null; p->rchild=null; //填写该结点数据

for (i=0; i

if (i==0) //根结点无左子树,遍历序列的1—n-1是右子树

{p->lchild=null;

s.lvl=++R; s.l=i+1; s.h=n-1; s.f=p; s.lr=2; enqueue(Q,s);

}

else if (i==n-1) //根结点无右子树,遍历序列的1—n-1是左子树

{p->rchild=null;

s.lvl=++R; s.l=1; s.h=i-1; s.f=p; s.lr=1; enqueue(Q,s);

}

else //根结点有左子树和右子树

{s.lvl=++R; s.l=0; s.h=i-1; s.f=p; s.lr=1;enqueue(Q,s);//左子树有关信息入队列

s.lvl=++R; s.l=i+1;s.h=n-1;s.f=p; s.lr=2;enqueue(Q,s);//右子树有关信息入队列

}

while (!empty(Q)) //当队列不空,进行循环,构造二叉树的左右子树

{ s=delqueue(Q); father=s.f;

for (i=s.l; i<=s.h; i++)

if (in[i]==level[s.lvl]) break;

p=(bitreptr)malloc(sizeof(binode)); //申请结点空间 p->data=level[s.lvl]; p->lchild=null; p->rchild=null; //填写该结点数据if (s.lr==1) father->lchild=p;

else father->rchild=p; //让双亲的子女指针指向该结点

if (i==s.l)

{p->lchild=null; //处理无左子女

s.lvl=++R; s.l=i+1; s.f=p; s.lr=2; enqueue(Q,s);

}

else if (i==s.h)

{p->rchild=null; //处理无右子女

s.lvl=++R; s.h=i-1; s.f=p; s.lr=1; enqueue(Q,s);

}

else{s.lvl=++R; s.h=i-1; s.f=p; s.lr=1; enqueue(Q,s);//左子树有关信息入队列

s.lvl=++R; s.l=i+1; s.f=p; s.lr=2; enqueue(Q,s); //右子树有关信息入队列

}

}//结束while (!empty(Q))

return(p);

}//算法结束

36. .[题目分析]因为后序遍历栈中保留当前结点的祖先的信息,用一变量保存栈的最高栈顶指针,每当退栈时,栈顶指针高于保存最高栈顶指针的值时,则将该栈倒入辅助栈中,辅助栈始终保存最长路径长度上的结点,直至后序遍历完毕,则辅助栈中内容即为所求。

void LongestPath(BiTree bt)//求二叉树中的第一条最长路径长度

{BiTree p=bt,l[],s[]; //l, s是栈,元素是二叉树结点指针,l中保留当前最长路径中的结点

int i,top=0,tag[],longest=0;

while(p || top>0)

{ while(p) {s[++top]=p;tag[top]=0; p=p->Lc;} //沿左分枝向下

if(tag[top]==1) //当前结点的右分枝已遍历

{if(!s[top]->Lc && !s[top]->Rc) //只有到叶子结点时,才查看路径长度if(top>longest) {for(i=1;i<=top;i++) l[i]=s[i]; longest=top; top--;} //保留当前最长路径到l栈,记住最高栈顶指针,退栈

}

else if(top>0) {tag[top]=1; p=s[top].Rc;} //沿右子分枝向下 }//while(p!=null||top>0)

}//结束LongestPath

2、假设以邻接矩阵作为图的存储结构,编写算法判别在给定的有向图中是否存在一个简单有向回路,若存在,则以顶点序列的方式输出该回路(找到一条即可)。(注:图中不存在顶点到自己的弧)

[题目分析]有向图判断回路要比无向图复杂。利用深度优先遍历,将顶点分成三类:未访问;已访问但其邻接点未访问完;已访问且其邻接点已访问完。下面用0,1,2表示这三种状态。前面已提到,若dfs(v)结束前出现顶点u到v的回边,则图中必有包含顶点v和u的回路。对应程序中v的状态为1,而u是正访问的顶点,若我们找出u的下一邻接点的状态为1,就可以输出回路了。

void Print(int v,int start ) //输出从顶点start开始的回路。

{for(i=1;i<=n;i++)

if(g[v][i]!=0 && visited[i]==1 ) //若存在边(v,i),且顶点i的状态为1。

{printf(“%d”,v);

if(i==start) printf(“\n”); else Print(i,start);break;}//if

}//Print

void dfs(int v)

{visited[v]=1;

for(j=1;j<=n;j++ )

if (g[v][j]!=0) //存在边(v,j)

if (visited[j]!=1) {if (!visited[j]) dfs(j); }//if

else {cycle=1; Print(j,j);}

visited[v]=2;

}//dfs

void find_cycle() //判断是否有回路,有则输出邻接矩阵。visited数组为全局变量。 {for (i=1;i<=n;i++) visited[i]=0;

for (i=1;i<=n;i++ ) if (!visited[i]) dfs(i);

}//find_cycle

5、给定n个村庄之间的交通图,若村庄i和j之间有道路,则将顶点i和j用边连接,边上的Wij表示这条道路的长度,现在要从这n个村庄中选择一个村庄建一所医院,问这所医院应建在哪个村庄,才能使离医院最远的村庄到医院的路程最短?试设计一个解答上述问题的算法,并应用该算法解答如图所示的实例。20分

void Hospital(AdjMatrix w,int n)

//在以邻接带权矩阵表示的n个村庄中,求医院建在何处,使离医院最远的村庄到医院的路径最短。

{for (k=1;k<=n;k++) //求任意两顶点间的最短路径

for (i=1;i<=n;i++)

for (j=1;j<=n;j++)

if (w[i][k]+w[k][j]

m=MAXINT; //设定m为机器内最大整数。

for (i=1;i<=n;i++) //求最长路径中最短的一条。

{s=0;

for (j=1;j<=n;j++) //求从某村庄i(1<=i<=n)到其它村庄的最长路径。

if (w[i][j]>s) s=w[i][j];

if(s<=m) {m=s; k=i;}//在最长路径中,取最短的一条。m记最长路径,k记出发顶点的下标。

Printf(“医院应建在%d村庄,到医院距离为%d\n”,i,m);

}//for

}//算法结束

对以上实例模拟的过程略。各行中最大数依次是9,9,6,7,9,9。这几个最大数中最小者为6,故医院应建在第三个村庄中,离医院最远的村庄到医院的距离是6。

1、对图1所示的连通网G,请用Prim算法构造其最小生成树(每选取一条边画一个图)。

4、已知有向图G=(V,E),其中V={V1,V2,V3,V4,V5,V6,V7},

E={,,,,,,,,}

写出G的拓扑排序的结果。

G拓扑排序的结果是:V1、V2、V4、V3、V5、V6、V7

37.[题目分析]本题应使用深度优先遍历,从主调函数进入dfs(v)时,开始记数,若退出dfs()前,已访问完有向图的全部顶点(设为n个),则有向图有根,v为根结点。将n个顶点从1到n编号,各调用一次dfs()过程,就可以求出全部的根结点。题中有向图的邻接表存储结构、记顶点个数的变量、以及访问标记数组等均设计为全局变量。建立有向图g的邻接表存储结构参见上面第2题,这里只给出判断有向图是否有根的算法。

int num=0, visited[]=0 //num记访问顶点个数,访问数组visited初始化。

const n=用户定义的顶点数;

AdjList g ; //用邻接表作存储结构的有向图g。

void dfs(v)

{visited [v]=1; num++; //访问的顶点数+1

if (num==n) {printf(“%d是有向图的根。\n”,v); num=0;}//if

p=g[v].firstarc;

while (p)

{if (visied[p->adjvex]==0) dfs (p->adjvex);

p=p->next;} //while

visited[v]=0; num--; //恢复顶点v

}//dfs

void JudgeRoot()

//判断有向图是否有根,有根则输出之。

{static int i ;

for (i=1;i<=n;i++ ) //从每个顶点出发,调用dfs()各一次。

{num=0; visited[1..n]=0; dfs(i); }

}// JudgeRoot

算法中打印根时,输出顶点在邻接表中的序号(下标),若要输出顶点信息,可使用g[i].vertex。

数据结构复习参考题及参考答案

第一章概论自测题答案 一、填空题 1. 数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和运算等的学科。 2. 数据结构被形式地定义为(D, R),其中D是数据元素的有限集合,R是D上的关系有限集合。 3. 数据结构包括数据的逻辑结构、数据的存储结构和数据的运算这三个方面的内容。 4. 数据结构按逻辑结构可分为两大类,它们分别是线性结构和非线性结构。 5. 线性结构中元素之间存在一对一关系,树形结构中元素之间存在一对多关系,图形结构中元素之间存在多对多关系。 6.在线性结构中,第一个结点没有前驱结点,其余每个结点有且只有1个前驱结点;最后一个结点没有后续结点,其余每个结点有且只有1个后续结点。 7. 在树形结构中,树根结点没有前驱结点,其余每个结点有且只有1个前驱结点;叶子结点没有后续结点,其余每个结点的后续结点数可以任意多个。 8. 在图形结构中,每个结点的前驱结点数和后续结点数可以任意多个。 9.数据的存储结构可用四种基本的存储方法表示,它们分别是顺序、链式、索引和散列。 10. 数据的运算最常用的有5种,它们分别是插入、删除、修改、查找、排序。 11. 一个算法的效率可分为时间效率和空间效率。 二、单项选择题 (B)1. 非线性结构是数据元素之间存在一种: A)一对多关系B)多对多关系 C)多对一关系D)一对一关系 ( C )2. 数据结构中,与所使用的计算机无关的是数据的结构; A) 存储B) 物理

C) 逻辑D) 物理和存储 (C)3. 算法分析的目的是: A) 找出数据结构的合理性 B) 研究算法中的输入和输出的关系 C) 分析算法的效率以求改进 D) 分析算法的易懂性和文档性 (A)4. 算法分析的两个主要方面是: A) 空间复杂性和时间复杂性 B) 正确性和简明性 C) 可读性和文档性 D) 数据复杂性和程序复杂性 ( C )5. 计算机算法指的是: A) 计算方法 B) 排序方法 C) 解决问题的有限运算序列 D) 调度方法 (B)6. 计算机算法必须具备输入、输出和等5个特性。 A) 可行性、可移植性和可扩充性 B) 可行性、确定性和有穷性 C) 确定性、有穷性和稳定性 D) 易读性、稳定性和安全性 三、简答题 1.【严题集1.2②】数据结构和数据类型两个概念之间有区别吗? 答:简单地说,数据结构定义了一组按某些关系结合在一起的数组元素。数据类型不仅定义了一组带结构的数据元素,而且还在其上定义了一组操作。 2. 简述线性结构与非线性结构的不同点。 答:线性结构反映结点间的逻辑关系是一对一的,非线性结构反映结点间的逻辑关系是多对多的。 2. s=0;

(完整版)数据结构练习题(含答案)

数据结构练习题 习题1 绪论 1.1 单项选择题 1. 数据结构是一门研究非数值计算的程序设计问题中,数据元素的①、数据信息在计算机中的②以及一组相关的运算等的课程。 ① A.操作对象B.计算方法C.逻辑结构D.数据映象 ② A.存储结构B.关系C.运算D.算法 2. 数据结构DS(Data Struct)可以被形式地定义为DS=(D,R),其中D是①的有限集合,R是D上的②有限集合。 ① A.算法B.数据元素C.数据操作D.数据对象 ② A.操作B.映象C.存储D.关系 3. 在数据结构中,从逻辑上可以把数据结构分成。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 4. 算法分析的目的是①,算法分析的两个主要方面是②。 ① A. 找出数据结构的合理性 B. 研究算法中的输入和输出的关系 C. 分析算法的效率以求改进 D. 分析算法的易懂性和文档性 ② A. 空间复杂性和时间复杂性 B. 正确性和简明性 C. 可读性和文档性 D. 数据复杂性和程序复杂性 5. 计算机算法指的是①,它必具备输入、输出和②等五个特性。 ① A. 计算方法 B. 排序方法 C. 解决问题的有限运算序列 D. 调度方法 ② A. 可行性、可移植性和可扩充性 B. 可行性、确定性和有穷性 C. 确定性、有穷性和稳定性 D. 易读性、稳定性和安全性 1.2 填空题(将正确的答案填在相应的空中) 1. 数据逻辑结构包括、和三种类型,树形结构和图形结构合称为。 2. 在线性结构中,第一个结点前驱结点,其余每个结点有且只有个前驱结点;最后一个结点后续结点,其余每个结点有且只有个后续结点。 3. 在树形结构中,树根结点没有结点,其余每个结点有且只有个直接前驱结点,叶子结点没有结点,其余每个结点的直接后续结点可以。 4. 在图形结构中,每个结点的前驱结点数和后续结点数可以。 5. 线性结构中元素之间存在关系,树形结构中元素之间存在关系,图形结构中元素之间存在关系。 6. 算法的五个重要特性是__ __ , __ __ , ___ _ , __ __ , _ ___。 7. 分析下面算法(程序段),给出最大语句频度,该算法的时间复杂度是__ __。 for (i=0;i

(完整版)数据结构复习题目及答案

《数据结构-C语言版》 第一章绪论 单项选择题 1.在数据结构中,数据的基本单位是_____ ____。 A. 数据项 B. 数据类型 C. 数据元素 D. 数据变量 2.数据结构中数据元素之间的逻辑关系被称为__ ____。 A. 数据的存储结构 B. 数据的基本操作 C. 程序的算法 D. 数据的逻辑结构3.在数据结构中,与所使用计算机无关的是数据的____ ___。 A. 存储结构 B. 逻辑和物理结构 C. 逻辑结构 D. 物理结构4.在链式存储结构中,数据之间的关系是通过____ ____体现的。 A. 数据在内存的相对位置 B. 指示数据元素的指针 C. 数据的存储地址 D. 指针 5.计算算法的时间复杂度是属于一种____ ___。 A. 事前统计的方法 B. 事前分析估算的方法 C. 事后统计的方法 D. 事后分析估算的方法 6.在对算法的时间复杂度进行估计的时候,下列最佳的时间复杂度是____ __。 A. n2 B. nlogn C. n D. logn 7.设使用某算法对n个元素进行处理,所需的时间是T(n)=100nlog2n+200n+2000,则该算法的渐近时间复杂度为____ ___。 A. O(1) B. O(n) C. O(200n) D. O(nlog2n)

CDCBBDD 第二章线性表 单项选择题 1.链表不具有的特点是____ ____。 A. 可随机访问任一元素 B. 插入和删除时不需要移动元素 C. 不必事先估计存储空间 D. 所需空间与线性表的长度正比 2.设顺序表的每个元素占8个存储单元。第1个单元的存储地址是100,则第6个元素占用的最后一个存储单元的地址为。 A. 139 B. 140 C. 147 D. 148 3.在线性链表存储结构下,插入操作算法。 A. 需要判断是否表满 B. 需要判断是否表空 C. 不需要判断表满 D. 需要判断是否表空和表满 4.在一个单链表中,若删除p所指结点的后继结点,则执行。 A. p->next = p->next->next; B. p->next = p->next; C. p = p->next->next; D. p = p->next; p->next = p->next->next; 5.将长度为n的单链表接在长度为m的单链表之后的算法时间复杂度为。A. O(n) B. O(1) C. O(m) D. O(m+n) 6.需要预分较大空间,插入和删除不需要移动元素的线性表,其存储结构是。 A. 单链表 B. 静态链表 C. 线性链表 D. 顺序存储方式ACCABB 填空题 1.在带表头结点的单链表中,当删除某一指定结点时,必须找到该结点的_____结点。2.在单链表中,指针p所指结点为最后一个结点的条件是。 3.将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是。4.在一个长度为n的顺序表中第i个元素(1≤i≤n)之前插入一个元素时,需向后移动元素的个数是。 5.在长度为n的顺序表中插入一个元素的时间复杂度为。 1前驱 2 p->next==NULL

《数据结构》复习题及答案

《数据结构》复习题及答案 一、判断题 1.线性表链式存储的特点是可以用一组任意的存储单元存储表中的数据元素。(√)2.一个栈的输入序列为:A,B,C,D,可以得到输出序列:C,A,B,D。(ㄨ) 3.稀疏矩阵压缩存储后,必会失去随机存取功能。(√) 4.如果某个有向图的邻接表中第i条单链表为空,则第i个顶点的出度为零。(√)5.用邻接矩阵存储图,所占用的存储空间大小只与图中顶点个数有关,而与图的边数无关。(√) 6.向二叉排序树中插入一个结点需要比较的次数可能大于该二叉树的高度。(ㄨ) 7.逻辑结构与数据元素本身的内容和形式无关。(√)1.设无向图G(所下图所示),要求给出从1出发对该图进行深度优先和广度优先遍历的序列。 8.对链表进行插入和删除操作时不必移动链表中结点。( √ ) 9.如果两个串含有相同的字符,则说明它们相等。( ㄨ ) 10.在线索二叉树中,任一结点均有指向其前趋和后继的线索。( ㄨ) 11.带权无向图的最小生成树是唯一的。(ㄨ) 12.稀疏矩阵的压缩存储可以用一个三元组表来表示稀疏矩阵中的非0元素。(√)13.无向图的邻接矩阵一定是对称的,有向图的邻接矩阵一定是不对称的。( ㄨ ) 14.分块查找的平均查找长度不仅与索引表的长度有关,而且与块的长度有关。(√)15.由树转化成二叉树,该二叉树的右子树不一定为空。(ㄨ) 16.稀疏矩阵的压缩存储可以用一个三元组表来表示稀疏矩阵中的非0元素。(√)17.分块查找的平均查找长度不仅与索引表的长度有关,而且与块的长度有关。(√)18.设初始记录关键字基本有序,则快速排序算法的时间复杂度为O(nlog2n)。(ㄨ)19.每种数据结构都具备三个基本操作:插入、删除和查找。(ㄨ) 20.顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。(×) 二、单项选择题 1.下面关于线性表的叙述错误的是( D )。 A 线性表采用顺序存储必须占用一片连续的存储空间 B 线性表采用链式存储不必占用一片连续的存储空间 C 线性表采用链式存储便于插入和删除操作的实现 D 线性表采用顺序存储便于插入和删除操作的实现 2.单链表的存储密度( C )。 A.大于1 B.等于1 C.小于1 D.不能确定 3.设输入序列为1、2、3、4、5、6,则通过栈的作用后可以得到的输出序列为( B )。 A 5,3,4,6,1,2 B 3,2,5,6,4,1 C 3,1,2,5,4,6 D 1,5,4,6,2,3 4.若串S="SOFTWARE",其子串的数目最多是:( C )。 A.35 B.36 C.37 D.38

(完整版)数据结构试题及答案

《数据结构》自考复习思考试题○10 一、单项选择题(本大题共15小题,每小题2分,共30分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上 ( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的头指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4 6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 设主串长为n,模式串长为m(m≤n),则在匹配失败情况下,朴素匹配算法进行的无效位移次数为( ) A. m B. n-m C. n-m+1 D. n 8. 二维数组A[12][18]采用列优先的存储方法,若每个元素各占3个存储单元,且第1个元素的地址为150,则元素A[9][7]的地址为( ) A. 429 B. 432 .

(完整版)数据结构复习题(附答案)

一、算法设计题(每题15分,共60分) 答题要求: ①用自然语言说明所采用算法的思想; ②给出每个算法所需的数据结构定义,并做必要说明; ③写出对应的算法程序,并做必要的注释。 1、有一个带头结点的单链表,每个结点包括两个域,一个是整型域info,另一个是指向下一个结点的指针域next。假设单链表已建立,设计算法删除单链表中所有重复出现的结点,使得info域相等的结点只保留一个。 3、约瑟夫环问题(Josephus问题)是指编号为1、2、…,n的n(n>0)个人按顺时针方向围坐成一圈,现从第s个人开始按顺时针方向报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列,…,如此重复直到所有的人全部出列为止。现要求采用循环链表结构设计一个算法,模拟此过程。 4、编程实现单链表的就地逆置。 23.在数组 A[1..n]中有n个数据,试建立一个带有头结点的循环链表,头指针为h,要求链中数据从小到大排列,重复的数据在链中只保存一个. 5、设计一个尽可能的高效算法输出单链表的倒数第K个元素。 3、假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序列。(15分) (1)下面所示的序列中哪些是合法的? A. IOIIOIOO B. IOOIOIIO C. IIIOIOIO D. IIIOOIOO (2)通过对(1)的分析,写出一个算法,判定所给的操作序列是否合法。若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中)。 5、设从键盘输入一整数的序列:a1, a2, a3,…,an,试编写算法实现:用栈结构存储输入的整数,当ai≠-1时,将ai进栈;当ai=-1时,输出栈顶整数并出栈。算法应对异常情况(入栈满等)给出相应的信息。 设有一个背包可以放入的物品重量为S,现有n件物品,重量分别为W1,W2,...,W n。问能否从这n件物品中选择若干件放入背包,使得放入的重量之和正好是S。设布尔函数Knap(S,n)表示背包问题的解,W i(i=1,2,...,n)均为正整数,并已顺序存储地在数组W中。请在下列算法的下划线处填空,使其正确求解背包问题。 Knap(S,n) 若S=0 则Knap←true 否则若(S<0)或(S>0且n<1) 则Knap←false 否则若Knap(1) , _=true 则print(W[n]);Knap ←true 否则 Knap←Knap(2) _ , _ 设有一个顺序栈S,元素s1, s2, s3, s4, s5, s6依次进栈,如果6个元素的出栈顺序为s2, s3, s4,

数据结构复习试题(附答案)

一、一、单选题(每题 2 分,共20分) 1.1.栈和队列的共同特点是( )。 A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 2.2.用链接方式存储的队列,在进行插入运算时( D ). A. 仅修改头指针 B. 头、尾指针都要修改 C. 仅修改尾指针 D.头、尾指针可能都要修改 3.3.以下数据结构中哪一个是非线性结构?( d ) A. 队列 B. 栈 C. 线性表 D. 二叉树 4.4.设有一个二维数组A[m][n],假设A[0][0]存放位置在644(10),A[2][2]存 放位置在676(10),每个元素占一个空间,问A[3][3](10)存放在什么位置?脚 注(10)表示用10进制表示。c A.688 B.678 C.692 D.696 5.5.树最适合用来表示( C )。 A.有序数据元素 B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据 6.6.二叉树的第k层的结点数最多为( D ). A.2k-1 B.2K+1 C.2K-1 D. 2k-1 7.7.若有18个元素的有序表存放在一维数组A[19]中,第一个元素放A[1] 中,现进行二分查找,则查找A[3]的比较序列的下标依次为( D ) A. 1,2,3 B. 9,5,2,3 C. 9,5,3 D. 9,4,2,3 8.8.对n个记录的文件进行快速排序,所需要的辅助存储空间大致为C A. O(1) B. O(n) C. O(1og2n) D. O(n2) 9.9.对于线性表(7,34,55,25,64,46,20,10)进行散列存储时, 若选用H(K)=K %9作为散列函数,则散列地址为1的元素有( D ) 个, A.1 B.2 C.3 D.4 10.10.设有6个结点的无向图,该图至少应有( 5 )条边才能确保是一个 连通图。 A.5 B.6 C.7 D.8 二、二、填空题(每空1分,共26分) 1. 1.通常从四个方面评价算法的质量:_________、_________、_________ 和_________。 2. 2.一个算法的时间复杂度为(n3+n2log2n+14n)/n2,其数量级表示为________。

数据结构试题及答案(十套)

数据结构试题及答案(十套)数据结构试题及答案(十套) 一、选择题 1. 数据结构是指()。 A. 存储数据的方式 B. 数据的逻辑结构和物理结构 C. 数据的存储结构和存储方式 D. 数据的逻辑结构、存储结构和存储方式 答案:D 2. 在数据结构中,线性表的存储方式包括()。 A. 顺序存储和链式存储 B. 数组存储和链表存储 C. 顺序存储、链表存储和索引存储 D. 顺序存储、链表存储和树形存储 答案:A 3. 栈是一种()的数据结构。 A. 先进先出

B. 先进后出 C. 后进先出 D. 后进后出 答案:C 4. 队列是一种()的数据结构。 A. 先进先出 B. 先进后出 C. 后进先出 D. 后进后出 答案:A 5. 二叉树中,度为0的节点称为()。 A. 叶子节点 B. 根节点 C. 中间节点 D. 子节点 答案:A 6. 以下哪个排序算法是稳定的?

A. 快速排序 B. 选择排序 C. 插入排序 D. 希尔排序 答案:C 7. 图中表示顶点之间关系的边的数量称为()。 A. 顶点度数 B. 边数 C. 路径数 D. 网络 答案:B 8. 哈希表通过()来实现高效的查找操作。 A. 散列函数 B. 排序算法 C. 遍历操作 D. 顺序存储 答案:A

9. 平衡二叉树是一种具有左右子树高度差不超过()的二叉树。 A. 0 B. 1 C. 2 D. 3 答案:B 10. 在链表中,删除节点的操作时间复杂度是()。 A. O(1) B. O(logn) C. O(n) D. O(nlogn) 答案:A 二、填空题 1. 在顺序存储结构中,元素之间的逻辑关系由()表示。 答案:下标 2. 二叉查找树的中序遍历结果是一个()序列。 答案:递增 3. 哈希表通过散列函数将关键字映射到()上。

(完整版)数据结构练习题及参考答案

数据结构练习题 第一部分绪论 一、单选题 1. 一个数组元素a[i]与________的表示等价。 A、 *(a+i) B、 a+i C、 *a+i D、 &a+i 2. 对于两个函数,若函数名相同,但只是____________不同则不是重载函数。 A、参数类型 B、参数个数 C、函数类型 3. 若需要利用形参直接访问实参,则应把形参变量说明为________参数 A、指针 B、引用 C、值 4. 下面程序段的时间复杂度为____________。 for(int i=0; i

(完整版)数据结构试题及答案(10套最新)

单选题(每题2分,共20分) 1. 1.对一个算法的评价,不包括如下(B )方面的内容。 A. 健壮性和可读性B .并行性C.正确性D.时空复杂 度 2. 2.在带有头结点的单链表HL中,要向表头插入一个由指针p指向的结点, 则执行(A )o A. p->n ext=HL->n ext; HL->n ext=p; B. p->n ext=HL; HL=p; C. p-> next=HL; p=HL; D. HL=p; p-> next=HL; 3. 3.对线性表,在下列哪种情况下应当采用链表表示?( B ) A. 经常需要随机地存取元素 B.经常 需要进行插入和删除操作 C.表中元素需要占据一片连续的存储空间 D.表中元素的个数不变 4.4. 一个栈的输入序列为1 2 3,则下列序列中不可能是栈的输出序列的是 (C ) A. 2 3 1 C. 3 1 2 B. 3 2 1 D. 1 2 3 5. 5. AOV 网是- 种(D )o A.有向图 B.无向图 C.无向无环图 D .有向无环图 6. 6.采用开放定址法处理散列表的冲突时,其平均查找长度( B)o A .低于链接法处理冲突 B.高于链接法处理冲突 C.与链接法处理冲突相同 D .高于二分查找 7. 7.若需要利用形参直接访问实参时,应将形参变量说明为(D )参数。 A .值B.函数C.指针 D .引用 8. 8.在稀疏矩阵的带行指针向量的链接存储中,每个单链表中的结点都具有相 同的(A )o A .行号B.列号C.元素值 D .非零元素个数 9. 9.快速排序在最坏情况下的时间复杂度为( D )o A. O(log2n) B. 0(nlog2n) C. 0(n) D . 0(n2) 10.10.从二叉搜索树中查找一个元素时,其时间复杂度大致为(C )o A. O( n) B. O(1) C. O(log2 n) D. O( n2) 二、运算题(每题6分,共24分) 1. 1.数据结构是指数据及其相互之间的___________________ 当结点之间存在M 对N ( M : N )的联系时,称这种结构为 ______________________ o 2. 2.队列的插入操作是在队列的_ _尾__________ 行,删除操作是在队列的— 首______ 行。 3. 3.当用长度为N的数组顺序存储一个栈时,假定用top==N表示栈空,则 表示栈满的条件是___ top==0 __ (要超出才为满)______________ o 4. 4.对于一个长度为n的单链存储的线性表,在表头插入元素的时间复杂度

数据结构考试复习题及答案 (1)

1. 什么是数据结构?数据结构的主要特点是什么? 答:数据结构是计算机科学中的一个基本概念,它描述了数据(如数字、字符、图形等)的表示和组织方式。数据结构的主要特点包括数据元素的集合、数据元素之间的关系以及数据的存储表示。 2. 数组和链表有什么区别? 答:数组是一种线性数据结构,它使用连续的内存空间存储数据元素。数组的索引从0开始,并且元素的访问是线性的。链表则是一种更复杂的数据结构,它使用节点来存储数据元素,并通过指针链接各个节点。链表的访问方式更加灵活,可以通过节点进行随机访问。 3. 什么是栈和队列?它们的特点是什么? 答:栈是一种后进先出(LIFO)的数据结构,它只能进行插入和删除操作的一端。栈的特点是先入后出,即最后进入栈的元素总是最先被移除。队列是一种先进先出(FIFO)的数据结构,它具有双端,可以在两端进行插入和删除操作。队列的特点是先进先出,即最早进入队列的元素总是最先被移除。 4. 二叉树的基本操作有哪些?二叉树的遍历方式有哪些? 答:二叉树的基本操作包括插入、删除和搜索。二叉树的遍历方式有前序遍历、中序遍历和后序遍历。 5. 什么是树和二叉树?它们之间的关系是什么? 答:树是一种具有分支结构的抽象数据类型,它由节点和边组成。二叉树是树的一种特殊情况,它只有两个分支(左子节点和右

子节点)。在二叉树中,每个节点最多有两个孩子节点,而在更一般的树结构中,每个节点可以有任意数量的孩子节点。 6. 平衡二叉树和非平衡二叉树的区别是什么? 答:平衡二叉树和非平衡二叉树的主要区别在于它们在插入和删除操作时的平衡机制。平衡二叉树如AVL树和红黑树在插入和删除操作后能保持树的平衡,从而保证查询效率。而非平衡二叉树可能在插入和删除操作后失去平衡,需要额外的维护操作来保持树的性能。 7. 哈希表的基本原理是什么?哈希表的优点和缺点是什么? 答:哈希表是一种基于哈希函数的数据结构,它通过将键(key)映射到索引位置来存储和检索数据。哈希表的优点在于其快速的插入、删除和查找操作,这是通过哈希函数的高效映射实现的。然而,哈希表的缺点在于可能存在哈希冲突,即两个不同的键映射到相同的索引位置。这可能需要额外的处理来处理冲突并保持数据的完整性。 8. 什么是B树和B+树?它们在数据库系统中的应用是什么? 答:B树和B+树是用于数据库系统中的索引结构。B树是一种平衡的多路搜索树,它适用于需要高效查找、插入和删除操作的数据库系统。B+树是一种平衡的链式搜索树,它特别适合于磁盘或其他辅助存储设备上的数据存储。B+树中的每个节点都包含一些叶子节点,这些叶子节点之间通过指针相互连接,这使得范围查询和范围扫描变得高效。

(完整版)数据结构练习题及参考答案

数据结构练习题 第一部分 绪 论 一、单选题 1. 一个数组元素 a[i] 与 __________ 的表示等价。 A 、 *(a+i) B 、 a+i C 、 *a+i D 、 &a+i 2. 对于两个函数,若函数名相同,但只是 _______________ 不同则不是重载函数。 A 、 参数类型 B 、 参数个数 C 、 函数类型 3. 若需要利用形参直接访问实参,则应把形参变量说明为 _____________ 参数 A 、 指针 B 、 引用 C 、 值 4. 下面程序段的时间复杂度为 ______________ 。 for(int i=0; i

数据结构试题集(包含答案-完整版)

数据结构试题集(包含答案-完整版)数据结构试题集(包含答案-完整版) 1. 单选题 1) 数据结构是一种()。 a) 存储结构b) 算法c) 数据模型d) 网络 答案:c) 数据模型 解析:数据结构是一种用于组织和存储数据的方式,描述了数据之间的关系以及对数据的操作。 2) 以下哪种数据结构可以通过索引直接访问元素? a) 链表b) 队列c) 栈d) 数组 答案:d) 数组 解析:数组是一种线性数据结构,可以通过索引直接访问指定位置的元素。 2. 多选题 1) 哪些数据结构属于非线性结构?() a) 队列b) 树c) 栈d) 图 答案:b) 树d) 图

解析:线性结构中的元素存在一对一的关系,非线性结构中的元素 存在一对多或多对多的关系,树和图属于非线性结构。 2) 下列哪些操作可以在栈上进行?() a) 入栈b) 出栈c) 查找d) 删除 答案:a) 入栈b) 出栈 解析:栈是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。 3. 简答题 1) 请简要介绍线性表和非线性表。 答案:线性表是数据元素的一个有限序列,元素之间存在一对一的 关系。非线性表是指元素之间存在一对多或多对多的关系,如树和图。 2) 请解释什么是时间复杂度和空间复杂度。 答案:时间复杂度是衡量算法执行效率的度量,表示算法的运行时 间随输入规模增长的速度。空间复杂度是指算法执行过程中所需的存 储空间随输入规模增长的速度。 4. 编程题 题目:实现一个栈,包含push、pop和getMin三个操作,要求时间 复杂度为O(1)。 答案:

class MinStack: def __init__(self): self.stack = [] self.min_stack = [] def push(self, x): self.stack.append(x) if not self.min_stack or x <= self.min_stack[-1]: self.min_stack.append(x) def pop(self): if self.stack.pop() == self.min_stack[-1]: self.min_stack.pop() def getMin(self): return self.min_stack[-1] 解析:在栈的基础上,使用一个辅助栈min_stack来记录当前栈中的最小值。每次push操作时,判断新加入的元素是否小于等于 min_stack的栈顶元素,若是,则将该元素也push到min_stack中;pop 操作时,判断弹出的元素是否与min_stack的栈顶元素相等,若是,则也将min_stack的栈顶元素弹出。

数据结构复习题参考答案

数据结构总复习 第一部分课后习题 第一章课后习题 P16 1、2、5、6、9 第三章课后习题 P66 2、3 第四章课后习题 P88 1 第五章课后习题 P102 1、2 第六章课后习题 P134-135 1、3、16、18 完成P137 实验二构造哈夫曼编码 第七章课后习题 P177 1、2、4、8、10 第二部分综合习题 一、单项选择题 1.如果在数据结构中每个数据元素只可能有一个直接前驱,但可以有多个直接后继,则该结构是(C ) A. 栈 B. 队列 C. 树 D. 图 2.下面程序段的时间复杂度为(B ) for (i=0; inext==head B. p->next->next==head C. p->next==NULL D. p==head

4.若以S和X分别表示进栈和退栈操作,则对初始状态为空的栈可以进行的栈操作系列是( D ) A. SXSSXXXX B. SXXSXSSX C. SXSXXSSX D. SSSXXSXX 5.两个字符串相等的条件是(D ) A. 串的长度相等 B. 含有相同的字符集 C. 都是非空串 D. 串的长度相等且对应的字符相同 6.已知一棵含50个结点的二叉树中只有一个叶子结点,则该树中度为1的结点个数为( D ) A. 0 B. 1 C. 48 D. 49 7.算法分析的目的是:(C ) (A)找出数据结构的合理性(B)研究算法中输入和输出的关系(C)分析算法的效率以求改进(D)分析算法的易懂性和文档性 8.用链表表示线性表的优点是:( C ) (A)便于随机存取(B)花费的存储空间比顺序表少 (C)便于插入和删除(D)数据元素的物理顺序与逻辑顺序相同 9.在数组表示的循环队列中,front、rear分别为队列的头、尾指针,maxsize为数组的最大长度,队满的条件是:( D ) (A)front=rear (B)rear=maxsize (C)rear=front (D)(rear+1)%maxsize=front 10.若已知一棵二叉树先序序列为ABCDEFG,中序序列为CBDAEGF,则其后序序列为:( A ) (A)CDBGFEA (B)CDBFGEA (C)CDBAGFE (D)BCDAGFE 11.执行下列程序段,执行S的次数(S这段程序的时间复杂度)是:(D )for(int i=1;i<=n;i++) for(int j=1;j<=i;j++)

ok数据结构复习题(客观题带答案)

数据结构复习题(客观题带答案) (分数仅供参考) 一、选择题(每题2分) 1.用二分法对一个长度为12的有序表进行二分查找,若各元素被等概率查找,则查找成功下所需的平均关键字得比较次数是 B 。 A)35/12 B)37/12 C)39/12 D)43/12 2.若一个序列的进栈顺序为1,2,3,4,则 B 不是一个对应的出栈序列。 A)3,2,1,4 B)4,2,3,1 C)4,3,2,1 D)1,2,3,4 3.具有65个结点的完全二叉树,其深度为 B 。(根在第1层)A)8 B)7 C)6 D)5 4.若表r在排序前已按元素键值递增顺序排列,采用 A 方法比较次数最少。 A)直接插入排序B)快速排序C)归并排序D)选择排序 5.如果要求一个线性表既能较快地查找,又能适应动态变化的要求,可采用 C 查找方法。 A)顺序B)二分C)分块D)随机 6. 下列 C 排序方法在每趟结束后不一定能选出一个元素放在其排好序的位置 上。 A)选择B)冒泡C)归并D)堆 7.对5个不同的数据进行排序,最多需要比较 B 次。 A)8 B)10 C)15 D)25 8.下列排序算法中,稳定的是 B 排序。 A)直接选择B)直接插入C)快速D)堆 9.在线性表的存储结构中,能实现随机存取的是 D 。 A)单链表B)双链表C)循环链表D)顺序表 10.采用分块查找时,若线性表中共有225个元素,查找每个元素的概率相同,假设采用顺序查找来确定结点所在的块时,每块应分为 C 个结点最佳。 A)12 B)10 C)15 D)25 11.设顺序表中有10个元素。删除第4个元素需移动 B 个元素。 (A)5 (B)6 (C)7 (D)8 12.由n个结点所构成的二叉树其最小可能的高度是 D 。 (A)log2(n+1) (B)log2n+1 (C)log2n (D)∟log2n⊥+1 13.在一棵度为4的树中,度为4的结点有1个,度为3的结点有2个,度为0的结点11个,则度为2的结点有 C 个。 (A)5 (B)4 (C)3 (D)2 14.将n个权值作为叶结点上的权值开始构成的哈夫曼树上有 C 个非叶结点。 (A)n (B)2n-1 (C)n-1 (D)n+1 15.二叉排序树上最小的结点在 A 。 (A)最左下(B)最右下(C)叶中(D)内结点 16. 设长度为100的分块索引表均匀分成10块,确定块号和在块内查找均采用线性查找,则查找的平均查找长度为 A 。 (A)11 (B)10 (C)5.5 (D)log2101-1 17.由6棵结点数均为5的树所组成的森林转化的二叉树中,根结点的右子树上一定有

期末数据结构复习习题(含答案)

数据结构练习题 数据结构练习题(1-5章) 一、选择题 1、从逻辑上可以把数据结构分为(C)两大类。 A.动态结构、静态结构B.顺序结构、链式结构 C.线性结构、非线性结构D.初等结构、构造型结构 2、以下数据结构中,哪一个是线性结构( D)? A.广义表 B. 二叉树 C. 稀疏矩阵 D. 串 3、在下面的程序段中,对x的赋值语句的频度为(C) for (i=1;i<=n;i++) for (j=1;j<=n;i++) x=x+1; n) A. O(2n) B.O(n) C.O(n2) D.O(log 2 4、下面关于线性表的叙述中,错误的是哪一个?( B ) A.线性表采用顺序存储,必须占用一片连续的存储单元。 B.线性表采用顺序存储,便于进行插入和删除操作。 C.线性表采用链接存储,不必占用一片连续的存储单元。 D.线性表采用链接存储,便于插入和删除操作。 5、某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用( D )存储方式最节省运算时间。 A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表 6、静态链表中指针表示的是( B). A.内存地址 B.数组下标 C.下一元素地址 D.左、右孩子地址 7、下面的叙述不正确的是( BC) A.线性表在链式存储时,查找第i个元素的时间同i的值成正比 B. 线性表在链式存储时,查找第i个元素的时间同i的值无关 C. 线性表在顺序存储时,查找第i个元素的时间同i 的值成正比 D. 线性表在顺序存储时,查找第i个元素的时间同i的值无关 8、若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间 复杂度为( C )(1<=i<=n+1)。 A. O(0) B. O(1) C. O(n) D. O(n2) 9、在单链表指针为p的结点之后插入指针为s的结点,正确的操作是:( B )。 A.p->next=s;s->next=p->next; B. s->next=p->next;p->next=s; C.p->next=s;p->next=s->next; D. p->next=s->next;p->next=s; 10、对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是( B ) A.head==NULL B.head→next==NULL C.head→next==head D.head!=NULL 11、一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是( B)。 A. 不确定 B. n-i+1 C. i D. n-i 12、有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?( C ) A. 5 4 3 6 1 2 B. 4 5 3 1 2 6 C. 3 4 6 5 2 1 D. 2 3 4 1 5 6 13、设有三个元素X,Y,Z顺序进栈(进的过程中允许出栈),下列得不到的出栈排列是( C )。 A.XYZ B. YZX C. ZXY D. ZYX 14、假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中

《数据结构》期末考试复习题及参考答案

数据结构复习题 (课程代码 252259) 一、填空题(本大题共40小题) 1.队列中是按照______先进先出______的原则进行数据元素的增删。 2.___栈__又称为LIFO表。 3.在顺序存储的完全二叉树中,若编号为i的结点有左孩子结点,则其右孩子结点的编号 为___2i+1___。 4.存储地址与关键字之间存在某种映射关系的存储结构为_______散列存储结构_______。 5.在串S=“structure”中,以r为首字符的子串有_9_个。 6.设有整型二维数组M[4][3],每个元素(整数)占2个存储单元,元素按行的顺序存储, 数组的起始地址为200,元素M[1][1]的地址是___208____。 7.在一个具有n个顶点的无向完全图中,包含有___ n(n-1)/2_____条边,在一个具有n 个顶点的有向完全图中,包含有__ n(n-1)______条边。 8.假定一个线性表为(12,23,74,55,63,40),若按Key % 4条件进行划分,使得同一余数的元 素成为一个子表,则得到的四个子表分别为_____(12,40)()(74)(23,55,63)____。 9.向一棵B_树插入元素的过程中,若最终引起树根结点的分裂,则新树比原树的高度____ 增加1______。 10.在堆排序的过程中,对任一分支结点进行筛运算的时间复杂度为__ O(log2n)______, 整个堆排序过程的时间复杂度为__ O(nlog2n)______。 11.在快速排序、堆排序、归并排序中,____归并_____排序是稳定的。 12.一棵深度为5的满二叉树中的结点数为_______31_______个。 13.在含n个顶点和e条边的无向图的邻接矩阵中,非零元素的个数为__2e __。 14.从一棵二叉排序树中查找一个元素时,若元素的值大于根结点的值,则继续向____右子 树____查找。 15._____拓朴排序______可以判断出一个有向图中是否有环。 16.栈又称为______后进先出__________的线性表。 17.数据结构在计算机中的表示称为数据的__物理结构____。 18.有4个结点的不同的二叉树有__9___棵。 19.含有60个结点的树有____59____条分支。 20.在图结构中,前驱元素和后继元素之间存在着_____多对多____的联系。 21.____哈夫曼树____又称最优二叉树。

相关主题
文本预览
相关文档 最新文档