文档库 最新最全的文档下载
当前位置:文档库 › 数据结构与算法课后习题答案

数据结构与算法课后习题答案

数据结构与算法课后习题答案
数据结构与算法课后习题答案

课后习题解答

判断题

1.线性表的逻辑顺序与存储顺序总是一致的。(×)

2.顺序存储的线性表可以按序号随机存取。(√)

3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。(×)

4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此属于同一数据对象。(√)

5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定相邻。(×)

6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。(√)7.线性表的链式存储结构优于顺序存储结构。(×)

8.在线性表的顺序存储结构中,插入和删除时移动元素的个数与该元素的位置有关。(√)

9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。(√)10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。(×)

11.静态链表既有顺序存储的优点,又有动态链表的优点。所以它存取表中第i个元素的时间与i无关。(×)

12.线性表的特点是每个元素都有一个前驱和一个后继。(×)

算法设计题

1.设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。试写一算法,将x 插入到线性表的适当位置上,以保持线性表的有序性,并且分析算法的时间复杂度。【提示】直接用题目中所给定的数据结构(顺序存储的思想是用物理上的相邻表示逻辑上的相邻,不一定将向量和表示线性表长度的变量封装成一个结构体),因为是顺序存储,分配的存储空间是固定大小的,所以首先确定是否还有存储空间,若有,则根据原线性表中元素的有序性,来确定插入元素的插入位置,后面的元素为它让出位置,(也可以从高下标端开始一边比较,一边移位)然后插入x ,最后修改表示表长的变量。

int insert (datatype A[],int *elenum,datatype x) /*设elenum为表的最大下标*/

{if (*elenum==arrsize-1) return 0; /*表已满,无法插入*/

else {i=*elenum;

while (i>=0 && A[i]>x) /*边找位置边移动*/

{A[i+1]=A[i];

i--;

}

A[i+1]=x; /*找到的位置是插入位的下一位*/

(*elenum)++;

return 1; /*插入成功*/

}

}

时间复杂度为O(n)。

2.已知一顺序表A,其元素值非递减有序排列,编写一个算法删除顺序表中多余的值相同的元素。

【提示】对顺序表A,从第一个元素开始,查找其后与之值相同的所有元素,将它们删除;再对第二个元素做同样处理,依此类推。

void delete(Seqlist *A)

{i=0;

while(ilast) /*将第i个元素以后与其值相同的元素删除*/

{k=i+1;

while(k<=A->last&&A->data[i]==A->data[k])

k++; /*使k指向第一个与A[i]不同的元素*/

n=k-i-1; /*n表示要删除元素的个数*/

for(j=k;j<=A->last;j++)

A->data[j-n]=A->data[j]; /*删除多余元素*/

A->last= A->last -n;

i++;

}

}

3.写一个算法,从一个给定的顺序表A中删除值在x~y(x<=y)之间的所有元素,要求以较高的效率来实现。

【提示】对顺序表A,从前向后依次判断当前元素A->data[i]是否介于x和y之间,若是,并不立即删除,而是用n记录删除时应前移元素的位移量;若不是,则将A->data[i]向前移动n位。n用来记录当前已删除元素的个数。

void delete(Seqlist *A,int x,int y)

{i=0;

n=0;

while (ilast)

{if (A->data[i]>=x && A->data[i]<=y) n++; /*若A->data[i] 介于x和y之间,n自增*/

else A->data[i-n]=A->data[i]; /*否则向前移动A->data[i]*/

i++;

}

A->last-=n;

}

4.线性表中有n个元素,每个元素是一个字符,现存于向量R[n]中,试写一算法,使R中的字符按字母字符、数字字符和其它字符的顺序排列。要求利用原来的存储空间,元素移动次数最小。

【提示】对线性表进行两次扫描,第一次将所有的字母放在前面,第二次将所有的数字放在字母之后,其它字符之前。

int fch(char c) /*判断c是否字母*/

{if(c>='a'&&c<='z'||c>='A'&&c<='Z') return (1);

else return (0);

}

int fnum(char c) /*判断c是否数字*/

{if(c>='0'&&c<='9') return (1);

else return (0);

}

void process(char R[n])

{low=0;

high=n-1;

while(low

{while(low

while(low

if(low

{k=R[low];

R[low]=R[high];

R[high]=k;

}

}

low=low+1;

high=n-1;

while(low

while(low

if(low

{k=R[low];

R[low]=R[high];

R[high]=k;

}

}

}

5.线性表用顺序存储,设计一个算法,用尽可能少的辅助存储空间将顺序表中前m个元素和后n个元素进行整体互换。即将线性表:

(a1, a2, … , a m, b1, b2, … , b n)改变为:

(b1, b2, … , b n , a1, a2, … , a m)。

【提示】比较m和n的大小,若m

void process(Seqlist *L,int m,int n)

{if(m<=n)

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

{x=L->data[0];

for(k=1;k<=L->last;k++)

L->data[k-1]=L->data[k];

L->data[L->last]=x;

}

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

{x=L->data[L->last];

for(k=L->last-1;k>=0;k- -)

L->data[k+1]=L->data[k];

L->data[0]=x;

}

}

6.已知带头结点的单链表L中的结点是按整数值递增排列的,试写一算法,将值为x 的结点插入到表L中,使得L仍然递增有序,并且分析算法的时间复杂度。

LinkList insert(LinkList L, int x)

{p=L;

while(p->next && x>p->next->data)

p=p->next; /*寻找插入位置*/

s=(LNode *)malloc(sizeof(LNode)); /*申请结点空间*/

s->data=x; /*填装结点*/

s->next=p->next;

p->next=s; /*将结点插入到链表中*/

return(L);

}

7.假设有两个已排序(递增)的单链表A和B,编写算法将它们合并成一个链表C而不改变其排序性。

LinkList Combine(LinkList A, LinkList B)

{C=A;

rc=C;

pa=A->next; /*pa指向表A的第一个结点*/

pb=B->next; /*pb指向表B的第一个结点*/

free(B); /*释放B的头结点*/

while (pa && pb)/*将pa、pb所指向结点中,值较小的一个插入到链表C的表尾*/

if(pa->datadata)

{rc->next=pa;

rc=pa;

pa=pa->next;

}

else

{rc->next=pb;

rc=pb;

pb=pb->next;

}

if(pa) rc->next=pa;

else rc->next=pb; /*将链表A或B中剩余的部分链接到链表C的表尾*/

return(C);

}

8.假设长度大于1的循环单链表中,既无头结点也无头指针,p为指向该链表中某一结点的指针,编写算法删除该结点的前驱结点。

【提示】利用循环单链表的特点,通过s指针可循环找到其前驱结点p及p的前驱结点q,然后可删除结点*p。

viod delepre(LNode *s)

{LNode *p, *q;

p=s;

while (p->next!=s)

{q=p;

p=p->next;

}

q->next=s;

free(p);

}

9.已知两个单链表A和B分别表示两个集合,其元素递增排列,编写算法求出A和B 的交集C,要求C同样以元素递增的单链表形式存储。

【提示】交集指的是两个单链表的元素值相同的结点的集合,为了操作方便,先让单链表C 带有一个头结点,最后将其删除掉。算法中指针p用来指向A中的当前结点,指针q用来指向B中的当前结点,将其值进行比较,两者相等时,属于交集中的一个元素,两者不等时,将其较小者跳过,继续后面的比较。

LinkList Intersect(LinkList A, LinkList B)

{LNode *q, *p, *r, *s;

LinkList C;

C= (LNode *)malloc(sizeof(LNode));

C->next=NULL;

r=C;

p=A;

q=B;

while (p && q )

if (p->datadata) p=p->next;

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

{s=(LNode *)malloc(sizeof(LNode));

s->data=p->data;

r->next=s;

r=s;

p=p->next;

q=q->next;

}

else q=q->next;

r->next=NULL;

C=C->next;

return C;

}

10.设有一个双向链表,每个结点中除有prior、data和next域外,还有一个访问频度freq域,在链表被起用之前,该域的值初始化为零。每当在链表进行一次Locata(L,x)运算后,令值为x的结点中的freq域增1,并调整表中结点的次序,使其按访问频度的非递增序列排列,以便使频繁访问的结点总是靠近表头。试写一个满足上述要求的Locata(L,x)算法。

【提示】在定位操作的同时,需要调整链表中结点的次序:每次进行定位操作后,要查看所查找结点的freq域,将其同前面结点的freq域进行比较,同时进行结点次序的调整。typedef struct dnode

{datatype data;

int freq;

struct DLnode *prior,*next;

}DLnode,*DLinkList;

DlinkList Locate(DLinkList L, datatype x)

{p=L->next;

while(p&&p->data!=x) p=p->next; /*查找值为x的结点,使p指向它*/

if(!p) return(NULL); /*若查找失败,返回空指针*/

p->freq++; /*修改p的freq域*/

while(p->prior!=L&&p->prior->freqfreq)/*调整结点的次序*/

{k=p->prior->data;

p->prior->data=p->data;

p->data=k;

k=p->prior->freq;

p->prior->freq=p->freq;

p->freq=k;

p=p->prior;

}

return(p); /*返回找到的结点的地址*/

}

课后习题解答 ##

选择题

1.向一个栈顶指针为Top的链栈中插入一个p所指结点时,其操作步骤为(C)。

A.Top->next=p; B.p->next=Top->next;Top->next=p;

C.p->next=Top;Top=p; D.p->next=Top;Top=Top->next;

2.对于栈操作数据的原则是(B)。

A.先进先出 B.后进先出 C.后进后出 D.不分顺序

3.若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,p N,若p N是n,则p i是(D)。

A.i B.n-i C. n-i+1 D.不确定

4.表达式a*(b-c)+d的后缀表达式是(B)。

A.abcd*-+ B.abc-*d+ C.abc*-d+ D.+-*abcd

5.采用顺序存储的两个栈共享空间S[1..m],top[i]代表第i个栈( i=1,2)的栈顶,栈1的底在S[1],栈2的底在S[m],则栈满的条件是(B)。

A.top[2]-top[1]|=0 B.top[1]+1=top[2]

C.top[1]+top[2]=m D.top[1]=top[2]

6.一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是(C)。

A. edcba B. decba C.dceab D. abcde

7.在一个链队列中,若f,r分别为队首、队尾指针,则插入s所指结点的操作为(B)。

A.f->next=r;f=s; B.r->next=s;r=s;

C.s->next=r;r=s; D.s->next=f;f=s;

8.用不带头结点的单链表存储队列时,在进行删除运算时(D)。

A.仅修改头指针B.仅修改尾指针

C.头、尾指针都要修改D.头、尾指针可能都要修改

9.递归过程或函数调用时,处理参数及返回地址,要用一种称为(C)的数据结构。

A.队列 B.静态链表C.栈 D.顺序表

10.栈和队都是(C)。

A.顺序存储的线性结构B.链式存储的非线性结构

C.限制存取点的线性结构D.限制存取点的非线性结构

判断题

1.栈和队列的存储,既可以采用顺序存储结构,又可以采用链式存储结构。(√)

2.任何一个递归过程都可以转换成非递归过程。(√)

3.若输入序列为1,2,3,4,5,6,则通过一个栈可以输出序列3,2,5,6,4,1。(√)

4.通常使用队列来处理函数的调用。(×)

5.循环队列通常用指针来实现队列的头尾相接。(×)

简答题

1.循环队列的优点是什么?如何判别它的空和满?

循环队列的优点是能够克服“假溢满”现象。

设有循环队列sq,队满的判别条件为:

(sq->rear+1)%maxsize==sq->front;或sq->num==maxsize。

队空的判别条件为:

sq->rear==sq->front。

2.栈和队列数据结构各有什么特点,什么情况下用到栈,什么情况下用到队列?

栈和队列都是操作受限的线性表,栈的运算规则是“后进先出”,队列的运算规则是“先进先出”。栈的应用如数制转换、递归算法的实现等,队列的应用如树的层次遍历等。

3.什么是递归?递归程序有什么优缺点?

一个函数在结束本函数之前,直接或间接调用函数自身,称为递归。例如,函数f在执行中,又调用函数f自身,这称为直接递归;若函数f在执行中,调用函数g,而g在执行中,又调用函数f,这称为间接递归。在实际应用中,多为直接递归,也常简称为递归。

递归程序的优点是程序结构简单、清晰,易证明其正确性。缺点是执行中占内存空间较多,运行效率低。

4.设有编号为1,2,3,4的四辆车,顺序进入一个栈式结构的站台,试写出这四辆车开出车站的所有可能的顺序(每辆车可能入站,可能不入站,时间也可能不等)。

1234,1243,1324,1342,1432,213,2143,2314,2341,2431,3214,3241,3421,4321

课后习题解答###

选择题

1.下面关于串的叙述错误的是(C)。

A.串是字符的有限序列

B.串既可以采用顺序存储,也可以采用链式存储

C.空串是由空格构成的串

D.模式匹配是串的一种重要运算

2.串的长度是指(B)。

A.串中所含不同字母的个数 B.串中所含字符的个数

C.串中所含不同字符的个数 D.串中所含非空格字符的个数

3.已知串S=‘aaab’,其Next数组值为(A)。

A.0123 B.1123 C.1231 D.1211

4.二维数组M的成员是6个字符(每个字符占一个存储单元)组成的串,行下标i的范围从0到8,列下标j的范围从1到10,则存放M至少需要(D)个字节;M的第8列和第5行共占(A)个字节;若M按行优先方式存储,元素M[8][5]的起始地址与当M按列优先方式存储时的(C)元素的起始地址一致。

(1)A.90 B.180 C.240 D.540

(2)A.108 B.114 C.54 D.60

(3)A.M[8][5] B.M[3][10] C.M[5][8] D.M[0][9]

5.数组A中,每个元素的存储占3个单元,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,存放该数组至少需要的单元个数是(C),若该数组按行存放,元素A[8][5]的起始地址是(D),若该数组按列存放,元素A[8][5]的起始地址是(B)。

(1)A.80 B.100 C.240 D.270

(2)A.SA+141 B.SA+144 C.SA+222 D.SA+225

(3)A.SA+141 B.SA+180 C.SA+117 D.SA+225

6.稀疏矩阵采用压缩存储,一般有(C)两种方法。

A.二维数组和三维数组 B.三元组和散列

C.三元组表和十字链表 D.散列和十字链表

判断题

1.串相等是指两个串的长度相等。(×)

2.KMP算法的特点是在模式匹配时指示主串的指针不会变小。(√)

3.稀疏矩阵压缩存储后,必会失去随机存取功能。(√)

4.数组是线性结构的一种推广,因此与线性表一样,可以对它进行插入,删除等操作。(×)

5.若采用三元组存储稀疏矩阵,把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算。(×)

6.若一个广义表的表头为空表,则此广义表亦为空表。(×)

7.所谓取广义表的表尾就是返回广义表中最后一个元素。(×)

简答题

1.KMP 算法较朴素的模式匹配算法有哪些改进?

KMP 算法主要优点是主串指针不回溯。当主串很大不能一次读入内存且经常发生部分匹配时,KMP 算法的优点更为突出。

2.设字符串S=‘aabaabaabaac',P=‘aabaac'。 (1)给出S 和P 的next 值和nextval 值;

(2)若S 作主串,P 作模式串,试给出利用KMP 算法的匹配过程。 【解答】

(1)S 的next 与nextval 值分别为0和0009,p 的next 与nextval 值分别为012123和002003。

(2)利用BF 算法的匹配过程: 利用KMP 算法的匹配过程:

第一趟匹配:aabaabaabaac 第一趟匹配:aabaabaabaac

aabaac(i=6,j=6) aabaac(i=6,j=6) 第二趟匹配:aabaabaabaac 第二趟匹配:aabaabaabaac aa(i=3,j=2) (aa)baac

第三趟匹配:aabaabaabaac 第三趟匹配:aabaabaabaac a(i=3,j=1) (成功) (aa)baac 第四趟匹配:aabaabaabaac aabaac(i=9,j=6) 第五趟匹配:aabaabaabaac aa(i=6,j=2) 第六趟匹配:aabaabaabaac a(i=6,j=1) 第七趟匹配:aabaabaabaac

(成功) aabaac(i=13,j=7)

3.假设按行优先存储整数数组A[9][3][5][8]时,第一个元素的字节地址是100,每个整数占4个字节。问下列元素的存储地址是什么?

(1) a 0000 (2)a 1111 (3)a 3125 (4)a 8247

【解答】(1) LOC( a 0000)= 100

(2) LOC( a 1111)=100+(3*5*8*1+5*8*1+8*1+1)*4=776 (3) LOC( a 3125)=100+(3*5*8*3+5*8*1+8*2+5) *4=1784 (4) LOC( a 8247)= 100+(3*5*8*8+5*8*2+8*4+7) *4=4816 4.假设一个准对角矩阵:

按以下方式存储于一维数组B[4m]中(m 为一个整数):

a 11 a 12

a 21 a 22

a 33 a 34

a 43 a 44

….

a ij

a 2m-1,2m-1 a 2m-1,2m

a 2m,2m-1 a 2m,2m

0 1 2 3 4 5 6 … k … 4m -1 4m

写出下标转换函数k=f(i,j)。 【解答】

由题目可知,每一行有两个非0元素。

当i 为奇数时,第i

行的元素为:a i,i 、a i,(i+1),此时k=2*(i-1)+j-i=i+j-2 当i 为偶数时,第i 行的元素为:a i,(i-1)、a i,i ,此时k=2*(i-1)+j-I+1=i+j-1

综上所述,k=i+j-i%2-1

5.设有n×n 的带宽为3的带状矩阵A ,将其3条对角线上的元素存于数组B[3][n]中,使得元素B[u][v]=a ij ,试推导出从(i,j )到 (u,v)的下标变换公式。 【解答】

u=j-i+1 v=j-1

6.现有如下的稀疏矩阵A (如图所示),要求画出以下各种表示方法。 (1)三元组表表示法 (2)十字链表法。

【解答】

(1)三元组表表示法:

(2)十字链表法:

0 0 0 22 0 -15 0 13 3 0 0 0 0 0 0 -6 0 0 0 0 0 0 0 0 91 0 0 0 0 0 0 0 28 0 0 0

0 1 2 3 4 5

0 1

7.画出下列广义表的头尾表示存储结构示意图。

(1)A=((a,b,c),d,(a,b,c))

(2)B=(a,(b,(c,d),e),f)

(1)

(2)

课后习题解答

选择题

1.下列说法正确的是(C)。

A.二叉树中任何一个结点的度都为2

B.二叉树的度为2

C.一棵二叉树的度可小于2

D.任何一棵二叉树中至少有一个结点的度为2

2.以二叉链表作为二叉树的存储结构,在具有n个结点的二叉链表中(n>0),空链域

的个数为(C)。

A.2n-1 B.n-1 C.n+1 D.2n+1

3.线索化二叉树中,某结点*p没有孩子的充要条件是(B)。

A.p->lchild=NULL B.p->ltag=1且p->rtag=1

C.p->ltag=0 D.p->lchild=NULL 且p->ltag=1

4.如果结点A有3个兄弟,而且B是A的双亲,则B的度是(B)。

A.3 B.4 C.5 D.1

5.某二叉树T有n个结点,设按某种顺序对T中的每个结点进行编号,编号值为1,2,...n。且有如下性质:T中任意结点v,其编号等于左子树上的最小编号减1,而v的右子树的结点中,其最小编号等于v左子树上结点的最大编号加1,这是按(B)编号的。

A.中序遍历序列B.先序遍历序列 C.后序遍历序列 D.层次顺序

6.设F是一个森林,B是由F转换得到的二叉树,F中有n个非终端结点,B中右指针域为空的结点有(C)个。

A.n-1 B. n C. n+1 D.n+2

7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是(C)。

A. 500 B. 501 C.490 D.495

8.设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为N1,N2和N3。与森林F对应的二叉树根结点的右子树上的结点个数是(D)。

A.N1 B.N1+N2 C.N2 D.N2+N3

9.任何一棵二叉树的叶结点在先序、中序、后序遍历序列中的相对次序(A)。

A.不发生改变 B.发生改变 C.不能确定 D.以上都不对

10.若一棵二叉树的后序遍历序列为dabec,中序遍历序列为debac,则先序遍历序列为(D)。

A.cbed B.decab C.deabc D.cedba

11.若一棵二叉树的先序遍历序列为abdgcefh,中序遍历的序列为dgbaechf,则后序遍历的结果为(D)。

A. gcefha B. gdbecfha C. bdgaechf D. gdbehfca

12.一棵非空二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足(B)。

A.所有的结点均无左孩子 B.所有的结点均无右孩子

C.只有一个叶子结点 D.是一棵满二叉树

13.引入线索二叉树的目的是(A)。

A.加快查找结点的前驱或后继的速度

B.为了能在二叉树中方便的进行插入与删除

C.为了能方便的找到双亲

D.使二叉树的遍历结果唯一

14.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为(B)。

A.2*h B. 2*h-1 C. 2*h+1 D.h+1

15.一个具有567个结点的二叉树的高h为(D)。

A.9 B.10 C.9至566之间 D.10至567之间

16.给一个整数集合{3,5,6,7,9},与该整数集合对应的哈夫曼树是(B)。

A. B. C. D.

判断题

1.二叉树是树的特殊形式。(√)

2.由树转换成二叉树,其根结点的右子树总是空的。(√)

3.先根遍历一棵树和先序遍历与该树对应的二叉树,其结果不同。(×)

4.先根遍历森林和先序遍历与该森林对应的二叉树,其结果不同。(×)

5.完全二叉树中,若一个结点没有左孩子,则它必是叶子。(√)

6.对于有N 个结点的二叉树,其高度为log2N+1。(×)

7.若一个结点是某二叉树子树的中序遍历序列中的最后一个结点,则它必是该子树的先序遍历序列中的最后一个结点。(√)

8.若一个结点是某二叉树子树的中序遍历序列中的第一个结点,则它必是该子树的后序遍历序列中的第一个结点。(√)

9.不使用递归也可实现二叉树的先序、中序和后序遍历。(√)

10.先序遍历二叉树的序列中,任何结点的子树的所有结点不一定跟在该结点之后。(×)11.先序和中序遍历用线索树方式存储的二叉树,不必使用栈。(×)

12.在后序线索二叉树中,在任何情况下都能够很方便地找到任意结点的后继。(×)13.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。(√)

14.在哈夫曼编码中,出现频率相同的字符编码长度也一定相同。(×)

15.用一维数组存放二叉树时,总是以先序遍历存储结点。(×)

16.由先序序列和后序序列能唯一确定一棵二叉树。(×)

17.由先序序列和中序序列能唯一确定一棵二叉树。(√)

18.对一棵二叉树进行层次遍历时,应借助于一个栈。(×)

19.完全二叉树可采用顺序存储结构实现存储,非完全二叉树则不能。(×)

20.满二叉树一定是完全二叉树,反之未必。(√)

简答题

1.一棵度为2的树与一棵二叉树有何区别?树与二叉树之间有何区别?

【解答】

①二叉树是有序树,度为2的树是无序树,二叉树的度不一定是2。

②二叉树是有序树,每个结点最多有两棵子树,树是无序树,且每个结点可以有多棵子

树。

2.对于图1所示二叉树,试给出:

(1)它的顺序存储结构示意图;

(2)它的二叉链表存储结构示意图;

(3)它的三叉链表存储结构示意图。

【解答】

(1)顺序存储结构示意图:

A B C D E F^^^G^^H

A

D

B

G

E

H

C

F

(图 1)

(2)二叉链表存储结构示意图: (3)三叉链表存储结构示意图:

3.对于图2所示的树,试给出:

(1)双亲数组表示法示意图;

(2)孩子链表表示法示意图; (3)孩子兄弟链表表示法示意图。

【解答】

(1)双亲数组表示法示意图: (2)孩子链表表示法示意图:

(3)孩子兄弟链表表示法示意图:

(图 2)

4.画出图3所示的森林经转换后所对应的二叉树,并指出森林中满足什么条件的结点在二叉树中是叶子。

【解答】

在二叉树中某结点所对应的森林中结点为叶子结点的条件是该结点在森林中既没有孩子也没有右兄弟结点。

5.将题5图所示的二叉树转换成相应的森林。

【解答】森林:

6.证明:在结点数多于1的哈夫曼树中不存在度为1的结点。 证明:由哈夫曼树的构造过程可知,哈夫曼树的每一分支结点都是由两棵子树合并产生的新结点,其度必为2,所以哈夫曼树中不存在度为1的结点。

7.证明:若哈夫曼树中有n 个叶结点,则树中共有2n -1个结点。

证明:n 个叶结点,需经n-1次合并形成哈夫曼树,而每次合并产生一个分支结点,所以树中共有2n-1个结点。

8.证明:由二叉树的前序序列和中序序列可以唯一地确定一棵二叉树。

证明:给定二叉树结点的前序序列和对称序(中序)序列,可以唯一确定该二叉树。因为前序序列的第一个元素是根结点,该元素将二叉树中序序列分成两部分,左边(设l 个元素)表示左子树,若左边无元素,则说明左子树为空;右边(设r 个元素)是右子树,若为空,则右子树为空。根据前序遍历中“根—左子树—右子树”的顺序,则由从第二元素开始

(图 3)

(题5图)

的l 个结点序列和中序序列根左边的l 个结点序列构造左子树,由前序序列最后r 个元素序列与中序序列根右边的r 个元素序列构造右子树。

9.已知一棵度为m 的树中有n 1个度为1的结点,n 2个度为2的结点,……,n m 个度为m 的结点,问该树中共有多少个叶子结点?有多少个非终端结点?

解:设树中共有n 个结点,n 0个叶结点,那么

n=n 0+n 1+…+n m (1)

树中除根结点外,每个结点对应着一个分支,而度为k 的结点发出k 个分支,所以: n=n 1+2*n 2+…+m*n m +1 (2)

由(1)、(2)可知n 0= n 2+2*n 3+3*n 4+…+(m -1)*n m +1

10.在具有n (n>1)个结点的树中,深度最小的那棵树其深度是多少?它共有多少叶子和非叶子结点?深度最大的那棵树其深度是多少?它共有多少叶子和非叶子结点?

2; n-1; 1; n; 1, n-1 11.设高度为h 的二叉树上只有度为0和度为2的结点,问该二叉树的结点数可能达到的最大值和最小值。

最大值:2h

-1; 最小值:2h-1

12.求表达式: a +b*(c -d)-e/f 的波兰式(前缀式)和逆波兰式(后缀式)。 波兰式: - + a * b – c d / e f 逆波兰式:a b c d - * + e f / - 13.画出和下列已知序列对应的树T :

树的先根次序访问序列为:GFKDAIEBCHJ ; 树的后根访问次序为:DIAEKFCJHBG 。

【解答】对应的二叉树和树分别如下左、右图所示:

14.画出和下列已知序列对应的森林F :

森林的先根次序访问序列为:ABCDEFGHIJKL ; 森林的后根访问次序为:CBEFDGAJIKLH 。

15.画出和下列已知序列对应的树T :

二叉树的层次访问序列为:ABCDEFGHIJ ; 二叉树的中序访问次序为:DBGEHJACIF 。

【解答】

按层次遍历,第一个结点(若树不空)为根,该结点在中序序列中把序列分成左右两部分—左子树和右子树。若左子树不空,层次序列中第二个结点左子树的根;若左子树为空,则层次序列中第二个结点右子树的根。对右子树也作类似的分析。层次序列的特点是:从左到右每个结点或是当前情况下子树的根或是叶子。

16.假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字母构成。它们在电文中出现的频度分别为{,,,,,,},

(1)为这7个字母设计哈夫曼编码。

(2)对这7个字母进行等长编码,至少需要几位二进制数?哈夫曼编码比等长编码使电文总长压缩多少?

(1)哈夫曼树: a :10 b :110

c :010

d :1110

e :011

f :00

g :1111

(2)对这7个字母进行等长编码,至少需要3位二进制数。 等长编码的平均长度:*3+*3+*3+*3+*3+*3+*3=3 哈夫曼编码:*2+*3+*3+*4+*3+*2+*4=

哈夫曼编码比等长编码使电文总长压缩了:1 - 3=%

算法设计题

1.给定一棵用二叉链表表示的二叉树,其根指针为root ,试写出求二叉树结点的数目的算法。

【提示】采用递归算法实现。

int count(BiTree root)

{ if (root==NULL) return (0);

else return (count(root->lchild)+count(root->rchild)+1);

} 2.请设计一个算法,要求该算法把二叉树的叶结点按从左至右的顺序链成一个单链表。二叉树按lchild-rchild 方式存储,链接时用叶结点的rchild 域存放链指针。

二叉树结点的数目=

当二叉树为空

左子树结点数目+右子树结点数目+1 当二叉树非空

【提示】这是一个非常典型的基于二叉树遍历算法,通过遍历找到各个叶子结点,因为不论前序遍历、中序遍历和后序遍历,访问叶子结点的相对顺序都是相同的,即都是从左至右。而题目要求是将二叉树中的叶子结点按从左至右顺序建立一个单链表,因此,可以采用三种遍历中的任意一种方法遍历。这里使用中序递归遍历。设置前驱结点指针pre ,初始为空。第一个叶子结点由指针head 指向,遍历到叶子结点时,就将它前驱的rchild 指针指向它,最后叶子结点的rchild 为空。 LinkList head,pre=NULL; /*全局变量*/ LinkList InOrder(BiTree T)

/*中序遍历二叉树T ,将叶子结点从左到右链成一个单链表,表头指针为head*/ { if(T) { InOrder(T->lchild);

/*中序遍历左子树

*/

if (T->lchild==NULL && T->rchild==NULL)

/*当前是叶子结点*/

if (pre==NULL) { head=T;

pre=T; } /*处理第一个叶子结点*/ else { pre->rchild=T;

pre=T; }

/*将叶子结点链入链表*/

InOrder(T->rchild);

/*中序遍历右子树*/

pre->rchild=NULL ; /*设置链表尾结点*/

return(head); }

3.给定一棵用二叉链表表示的二叉树,其根指针为root ,试写出求二叉树的深度的算法。

【提示】采取递归算法。

int Height(BiTree root) { int hl,hr;

if (root==NULL) return(0);

else { hl=Height(root->lchild);

hr=Height(root->rchild); if (hl>hr) return (hl+1); else return(hr+1); }

}

4.给定一棵用二叉链表表示的二叉树,其根指针为root ,试求二叉树各结点的层数。 【提示】采用先序递归遍历算法实现。

void fun (BiTree root, int n) { if (t==NULL) return;

else{ printf(“%d ”,n);

fun(root->lchild,n+1); fun(root->rchild,n+1);

}

二叉树结点的层次数=

1

当结点为根结点 其双亲结点的层次数+1

当结点非根结点

}

5.给定一棵用二叉链表表示的二叉树,其根指针为root,试写出将二叉树中所有结点的左、右子树相互交换的算法。

【提示】设root 为一棵用二叉链表存储的二叉树,则交换各结点的左右子树的运算可基于后序遍历实现:交换左子树上各结点的左右子树;交换左子树上各结点的左右子树;再交换根结点的左右子树。

void Exchange(BiTree root)

{ BiTNode *p;

if (root)

{ Exchange(root->lchild);

Exchange(root->rchild);

p=root->lchild;

root->lchild=root->rchild;

root->rchild=p;

}

}

6.一棵具有n个结点的完全二叉树采用顺序结构存储,试设计非递归算法对其进行先序遍历。

【提示】二叉树的顺序存储是按完全二叉树的顺序存储格式按层次存储的,双亲结点与子女结点的下标间有确定的关系。对顺序存储结构的二叉树进行先序遍历,与二叉链表存放二叉树的遍历策略类似。但是在顺序存储结构下,判二叉树结点为空的条件为:结点下标大于n,或结点值为0(一般二叉树中的“虚结点”)。

void PreOrder (datatype data[n+1]) /*0号单元未用*/

{ int stack[n] ;

int top;

if(n<1) return;

t=1;

top=0;

while (t<=n||top>0)

{ while (t<=n&&data[t]!=0)

{ Visite(data[t]);

stack[top]=t; top++;

t=t*2; }

if (top<=0) return;

else { top--; t=stack[top];

t=t*2+1; }

}

}

z7.二叉树中查找值为x的结点,试设计打印值为x 的结点的所有祖先结点算法。【提示】对二叉树进行先序非递归遍历,查找值为x的结点。进入子树时,将子树的根压栈;从子树返回时,将栈顶元素出栈。当找到值为x的结点时,栈中存放的就是其祖先结点,依次打印各结点的值。

void PrintNode (BiTree T, datatype x)

{ Init_Stack(S); /*初始化空栈*/

p=T;

while (p|| !Empty_Stack(S)) /*若p非空,或栈非空*/

{ while (p)

{ if (p->data==x) /*若当前结点值为x,依次输出栈中元素的值*/

{ while (!Empty_Stack(S))

{ Pop(S,q);

printf(q->data); }

return;

}

else{ Push_Stack(S,p);} /*若当前结点值不是x,压栈*/

p=p->lchild;

}

if(!Empty_Stack(S))

{ Pop_Stack(S,r); /*当栈非空,栈顶元素出栈,进入右子树*/

p=r->rchild; }

else return;

}

}

8.已知一棵二叉树的后序遍历序列和中序遍历序列,写出可以确定这棵二叉树的算法。【提示】根据后序遍历和中序遍历的特点,采用递归算法实现。

void InPost (char in [ ] , char post [ ] , int il , int ir, int pl, int pr, BiTree t)

/*数组in和数组post中存放着二叉树的中序遍历序列和后序遍历序列,il和ir表示中序遍历序列的左右端*/

/*点, pl和 pr表示后序遍历序列的左右端点,t表示二叉树的根*/

{ t=(BiTNode *) malloc(sizeof(BiTNode));

t->data=post[pr];

m=il;

while (in[m]!=post [pr] ) m++;

if (m== il) t->lchild=NULL ;

else InPost ( in, post,il,m-1,pl,pl+m-1-il, t->lchild);

if (m==ir) t->rchild=NULL;

else InPost (in,post,m+1,ir,pr-ir+m,pr-1,t->rchild);

}

9.编写算法判断一棵二叉链表表示的二叉树是否是完全二叉树。

【提示】根据完全二叉树的定义可知,对完全二叉树按照从上到下,从左到右的次序遍历应满足:①若某结点没有左孩子,则一定无右孩子;②若某结点缺(左或右)孩子,则其所有后继一定无孩子。因此,可采用按层次遍历二叉树的方法依次对每个结点进行判断。这里增加一个标志以表示所有已扫描过的结点均有左、右孩子,将局部判断结果存入CM中,CM表示整个二叉树是否是完全二叉树,B为1表示到目前为止所有结点均有左右孩子。

int CompleteBT(BiTree T)

{ Init_Queue(Q); /*初始化队列Q*/

力 扣 数 据 结 构 与 算 法

前端如何搞定数据结构与算法(先导篇) 「观感度:?」 「口味:锅包肉」 「烹饪时间:20min」 本文已收录在Github? 为什么要学习数据结构与算法? 在0202年的今天,由于每天被无数的信息轰炸,大多数人已经变得越来越浮躁了,并且丧失了独立思考的能力。 你可能会经常听到这样的感慨: 技术人究竟能走多远?我遇到了天花板 35岁的程序员要如何面对中年危机? 技术更新太快,好累,学不动了 然后,你也变得焦虑起来。那你有没有静下心来想过,如何才能抵御年龄增长并且使自己增值呢? 无非是终身学习,持续修炼自己的内功。内功也就是基础知识和核心概念,这些轰轰烈烈发展的技术本质,其实都是基础知识,也就是我们在大学里学过的基础课-程。 操作系统 计算机组成原理 计算机网络 编译原理

设计模式 数据结构与算法 这也就是为什么越靠谱的面试官越注重你基础知识的掌握程度,为什么越牛的的企业越重视你的算法能力。因为当你拥有了这些,你已经比大多数人优秀了。你的天花板由你自己来决定,大家口中的中年危机可能并不会成为你的危机。新技术来临时,你对它的本质会看得更加透彻,学起来会一通百通。这样的人才,公司培养你也会花费更少的成本。 (不过,一辈子做个开开心心的 CRUD Boy 也是一种选择。) 数据结构与算法之间的关系 Rob Pikes 5 Rules of Programming中的第五条是这样说的: Data dominates. If youve chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming. 数据占主导。如果您选择了正确的数据结构并组织得当,那么这些算法几乎总是不言而喻的。数据结构而非算法是编程的核心。 瑞士计算机科学家,Algol W,Modula,Oberon 和 Pascal 语言的设计师 Niklaus Emil Wirth 写过一本非常经典的书《Algorithms + Data Structures = Programs》,即算法 + 数据结构 = 程序。 我们可以得出结论,数据结构与算法之间是相辅相成的关系。数据结构服务于算法,算法作用于特定的数据结构之上。 数据结构与算法好难,怎么学?

数据结构与算法习题及答案

第1章绪论 习题 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。 3.简述逻辑结构的四种基本关系并画出它们的关系图。 4.存储结构由哪两种基本的存储方法实现 5.选择题 (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.树B.字符串C.队D.栈 6.试分析下面各程序段的时间复杂度。 (1)x=90;y=100; while(y>0) if(x>100) {x=x-10;y--;} elsex++; (2)for(i=0;i

数据结构与算法C语言版期末复习题

《数据结构与算法》期末复习题 一、选择题。 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑B.存储C.逻辑和存储D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。 A.数据的处理方法B.数据元素的类型 C.数据元素之间的关系D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位 B.数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。 (1)A.找出数据结构的合理性B.研究算法中的输入和输出的关系C.分析算法的效率以求改进C.分析算法的易读性和文档性 (2)A.空间复杂度和时间复杂度B.正确性和简明性 C.可读性和文档性D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是O(n2) 。 s =0; for( I =0; i

[第1题-60题汇总]微软数据结构+算法面试100题

精选微软等公司数据结构 精选微软等公司数据结构++算法面试100题 -----[第1题-60题总] 资源说明: 此份,是为微软等公司数据结构+算法面试100题,之前60题的汇总。 总结整理了前第1题-第60题。特此并作此一份上传。以飨各位。:)。 -------------------------------- 相关资源,包括答案,下载地址: [答案V0.2版]精选微软数据结构+算法面试100题[前20题]--答案修正 https://www.wendangku.net/doc/8812889263.html,/source/2813890 //此份答案是针对最初的V0.1版本,进行的校正与修正。 [答案V0.1版]精选微软数据结构+算法面试100题[前25题] https://www.wendangku.net/doc/8812889263.html,/source/2796735 [第二部分]精选微软等公司结构+算法面试100题[前41-60题]: https://www.wendangku.net/doc/8812889263.html,/source/2811703 [第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题] https://www.wendangku.net/doc/8812889263.html,/source/2778852 更多资源,下载地址: http://v_july_https://www.wendangku.net/doc/8812889263.html,/ 很快,我将公布第21-40题的答案,敬请期待。:).. 如果你对以下的前第1-60题,有好的思路,和算法,欢迎跟帖回复, 或者,联系我,发至我的邮箱, zhoulei0907@https://www.wendangku.net/doc/8812889263.html,。 My CSDN Blog:https://www.wendangku.net/doc/8812889263.html,/v_JULY_v My sina Blog:https://www.wendangku.net/doc/8812889263.html,/shitou009 帖子维护地址: [整理]算法面试:精选微软经典的算法面试100题[前1-60题] https://www.wendangku.net/doc/8812889263.html,/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html -------------------------------------- July、2010、/11.12.请享用。:)。 1

数据结构与算法复习题10(C语言版)

习 9解答 判断题: 1.用向量和单链表表示的有序表均可使用折半查找方法来提高查找速度。 答:FALSE (错。链表表示的有序表不能用折半查找法。) 2.有n 个数据放在一维数组A[1..n]中,在进行顺序查找时,这n 个数的排列有序或无序其平均查找长度不同。 答:FALSE (错。因顺序查找既适合于有序表也适合于无序表;对这两种表,若对于每个元素的查找概率相等,则顺序查找的ASL 相同,并且都是(n+1)/2;对于查找概率不同的情况,则按查找概率由大到小排序的无序表其ASL 要比有序表的ASL 小。) 3.折半查找是先确定待查有序表记录的范围,然后逐步缩小范围,直到找到或找不到该记录为止。( ) 答:TRUE 4.哈希表的查找效率主要取决于哈希表哈希表造表时选取的哈希函数和处理冲突的方法。 答:TRUE 5.查找表是由同一类型的数据元素(或记录)构成的集合。 答:TRUE 单选题: 6.对于18个元素的有序表采用二分(折半)查找,则查找A[3]的比较序列的下标为( )。 A. 1、2、3 B. 9、5、2、3 C. 9、5、3 D.9、4、2、3 答:D (第一次??2/)181(+ = 9,第二次??2/)81(+ = 4,第三次??2/)31(+ = 2, (第四次??2/)33(+ = 3,故选D. 7. 顺序查找法适合于存储结构为____________的线性表。 A.散列存储 B.顺序存储或链式存储 C.压缩存储 D.索引存储 答:B 8.对线性表进行二分查找时,要求线性表必须( )。 A .以顺序方式存储 B. 以链接方式存储 C .以顺序方式存储,且结点按关键字有序排序 D. 以链接方式存储,且结点按关键字有序排序 答:C 9.设哈希表长m=14,哈希函数为H(k) = k MOD 11。表中已有4个记录(如下图

计算机学院数据结构与算法分析期末试题(2007级B)_无答案

四川大学期末考试试题 (2008-2009学年第1学期) 课程号:课程名称:数据结构与算法分析(B卷)任课教师: 1.数据类型为()。 A)数据项的集合B)值的集合及定义在其上的一组操作的总称 C)数据元素的集合D)关键字的集合 2.链表不具有的特点是()。 A)可随机直接访问任一元素B)插入删除不需要移动元素 C)不必事先估计元素个数D)所需空间与线性表长度成正比 3.设一个栈的入栈序列是ABCD,则借助于一个栈所得到的出栈序列不可能是()。 A)ABCD B)DCBA C)ABCD D)DABC 4.将对称矩阵A nxn压缩存储在一维数组B[m]中,则m的值至少为()。 A)n(n+1)/2 B)n(n-1)/2 C)n(n+1) D)n2 5.设二叉树中有n2个度为2的结点,n1个度为1的结点,n0个叶子结点,则此二叉树中空指针域个数为()。 A)n0+n1+n2 B)n2+n1+2n0 C)2n2+n1D)2n0+n1 6.对于具有n个顶点的强连图,其弧条数的最小值为()。 A)n+1 B)n C)n-1 D)n-2 7.一棵深度为k的平衡二叉树,其每个非终端结点的平衡因子均为0,则该树共有()个结点。 A)2k-1-1 B)2k-1C)2k-1+1 D)2k-1 8.归并排序的时间复杂度是()。 A)O(1) B)O(n) C)O(n2) D)O(nlogn) 9.每一趟都能选出一个元素放在其最终位置上,并且不稳定的排序算法是()。 A)冒泡排序B)简单选择排序C)希尔排序D)直接插入排序10.按照二叉树的定义,具有3个结点的不同形态(相似)的二叉树有()种。 A)3 B)4 C)5 D)6 二、(本题10分) 利用两个栈S1、S2模拟一个队列(如客户队列)时,如何用栈的运算实现队列的插入、删除运算,请简述算法思想。 三、(本题10分) 已知一棵二叉树的先序序列与中序序列分别如下,试画出此二叉树。 先序序列:ABCDEFGH IJ 中序序列:CBEDAGHFJI 注:试题字迹务必清晰,书写工整。本题2页,本页为第1页 教务处试题编号:

阿里校园招聘历年经典面试题汇总:算法工程师

阿里校园招聘历年经典面试题汇总:算法工程师 (1)、jvm 原理 (2)、minor GC 与 Full GC (3)、HashMap 实现原理 (4)、java.util.concurrent 包下使用过哪些 (5)、concurrentMap 和 HashMap 区别 (6)、信号量是什么,怎么使用? (7)、阻塞队列了解吗?怎么使用? (8)、JAVA NIO 是什么? (9)、类加载机制是怎样的 (10)、什么是幂等性 (11)、有哪些 JVM 调优经验 (12)、分布式 CAP 了解吗? (13)、hdfs怎么添加Datanode,添加后hdfs会有什么操作? (14)、Hbase 跟关系数据库对比优缺点?为什么 Hbase 索引速度快 (15)、Hbase 大压缩与小压缩区别 (16)、Hive 与 Hbase 的使用场景 (17)、简单说说Spark功能,spark 与hive有无依赖关系? (18)、zookeeper 有什么应用场景,怎么选举的?3 个节点挂掉一个能正常工作吗? (19)、Hbase 中 zookeaper 作用 (20)、Hbase 写操作什么时候返回 (21)、mysql 有哪些存储引擎?各自特点 (22)、用过哪些设计模式?怎样实现线程安全单例模式? (23)、用过哪些RPC框架? (24)、什么是AOP? (25)、决策树算法怎么实现的? (26)、java垃圾回收会出现不可回收的对象吗?怎么解决内存泄露问题?怎么

定位问题源? (27)、终止线程有几种方式?终止线程标记变量为什么是 valotile 类型?(28)、用过哪些并发的数据结构? cyclicBarrier 什么功能?信号量作用?数据库读写阻塞怎么解决? (29)、乐观锁与悲观锁,怎么实现乐观锁? (30)、开发过分布式框架?怎么实现分布式事务? (31)、spark streaming与storm区别? (32)、找到最大子数组的 start,和end下标 (33)、用过 CDH中什么任务调度? (34)、spark streaming时间间隔设置很小会出现什么状况? (35)、搜索引擎了解多少?你认为搜索引擎的难点在哪里? (36)、RPC 了解吗?怎么监控 RPC 状态,找出出现问题的 RPC 连接?(37)、spring 框架了解多少? (38)、flume应用场景 (39)、找出一串字符中第一个不重复字符的下标。 点击查看详细面经〉〉〉〉〉〉〉〉〉〉〉〉 更多精品干货>>>>>>>>>>> 更多阿里机器学习/数据挖掘经典面试题 其他名企机器学习/数据挖掘经典面试题

数据结构与算法复习题库含答案

数据结构复习题 第一章概论 一、选择题 1、研究数据结构就是研究( D )。 A. 数据的逻辑结构 B. 数据的存储结构 C. 数据的逻辑结构和存储结构 D. 数据的逻辑结构、存储结构及其基本操作 2、算法分析的两个主要方面是( A )。 A. 空间复杂度和时间复杂度 B. 正确性和简单性C. 可读性和文档性 D. 数据复杂性和程序复杂性 3、具有线性结构的数据结构是( D )。 A. 图 B. 树 C. 广义表 D. 栈 4、计算机中的算法指的是解决某一个问题的有限运算序列,它必须具备输入、输出、( B )等5个特性。 A. 可执行性、可移植性和可扩充性 B. 可执行性、有穷性和确定性 C. 确定性、有穷性和稳定性 D. 易读性、稳定性和确定性 5、下面程序段的时间复杂度是( C )。 fori0;im;i++ forj0;jn;j++ a[i][j]i*j; A. Om2 B. On2 C. Om*n D. Om+n 6、算法是( D )。

A. 计算机程序 B. 解决问题的计算方法 C. 排序算法 D. 解决问题的有限运算序列 7、某算法的语句执行频度为(3n+nlog2n+n2+8),其时间复杂度表示( C )。 A. On B. Onlog2n C. On2 D. Olog2n 8、下面程序段的时间复杂度为( C )。 i1; whilein ii*3; A. On B. O3n C. Olog3n D. On3 9、数据结构是一门研究非数值计算的程序设计问题中计算机的数据元素以及它们之间的( B )和运算等的学科。 A. 结构 B. 关系 C. 运算 D. 算法 10、下面程序段的时间复杂度是( A )。 is0; whilesn i++;s+i; A. On B. On2 C. Olog2n D. On3 11、抽象数据类型的三个组成部分分别为( A )。 A. 数据对象、数据关系和基本操作 B. 数据元素、逻辑结构和存储结构 C. 数据项、数据元素和数据类型 D. 数据元素、数据结构和数据类型 12、通常从正确性、易读性、健壮性、高效性等4个方面评价算法的质量,以下解释错误的是(D)。

北京交通大学数据结构与算法期末测验考试参考答案

北京交通大学考试试题(A卷) 课程名称:数据结构与算法2011-2012学年第一学期出题教师:张勇 (请考生注意:(1)本试卷共有六道大题,(2)答案一律写在答题纸上,(3)试卷不得带出考场) 1. 在顺序表中访问任意一个元素的时间复杂度均为,因此顺序表也称为 的数据结构。 2.三维数组a[4][3][2](下标从0开始),假设a[0][0][0]的地址为50,数据以行序优先方式存储,每个元素的长度为2字节,则a[2][1][1]的地址是。 3. 直接插入排序用监视哨的作用是。 4. 已知广义表Ls=(a, (b, c), (d, e)), 运用head和tail函数取出Ls中的原子d的运算 是。 5.对有14个元素的有序表A[1..14]进行折半查找,当比较到A[4]时算法结束。被比较元素除A[4]外,还有。 6. 在AOV网中,顶点表示,边表示。 7. 有向图G可进行拓扑排序的判别条件是。 8. 若串S1=‘ABCDEFGHIJK’,S2=‘451223’,S3=‘####’,则执行 Substring(S1,Strlength(S3),Index(S2,‘12’,1))的结果是。 二、选择题(每空2分,共20分) 1.在下列存储形式中,哪一个不是树的存储形式?() A.双亲表示法B.孩子链表表示法 C.孩子兄弟表示法D.顺序存储表示法 2.查找n个元素的有序表时,最有效的查找方法是()。 A.顺序查找B.分块查找 C.折半查找D.二叉查找 3.将所示的s所指结点加到p所指结点之后,其语句应为()。 p (A) s->next=p+1 ; p->next=s;

(B) (*p).next=s; (*s).next=(*p).next; (C) s->next=p->next ; p->next=s->next; (D) s->next=p->next ; p->next=s; 4. 在有向图的邻接表存储结构中,顶点v 在链表中出现的次数是( )。 A. 顶点v 的度 B. 顶点v 的出度 C. 顶点v 的入度 D. 依附于顶点v 的边数 5. 算法的时间复杂度为O (nlog 2n )、空间复杂度为O(1)的排序算法是( )。 A. 堆排序 B. 快速排序 C. 归并排序 D.直接选择 6. 设矩阵A 是一个对称矩阵,为了节省存储,将其 下三角部分(如右图所示)按行序存放在一维数组B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素ai,j(i ≤j), 在一维数组B 中下标k 的值是( ): A.i(i-1)/2+j-1 B.i(i-1)/2+j C.i(i+1)/2+j-1 D.i(i+1)/2+j 7. 由一个长度为11的有序表,按二分查找法对该表进行查找,在表内各元素等概率情 况下,查找成功的平均查找长度是( )。 A .29/11 B. 31/11 C. 33/11 D.35/11 8. AVL 树是一种平衡的二叉排序树,树中任一结点的( )。 A. 左、右子树的高度均相同 B. 左、右子树高度差的绝对值不超过1 C. 左子树的高度均大于右子树的高度 D. 左子树的高度均小于右子树的高度 9. 下列四种排序方法中,不稳定的方法是( )。 A. 直接插入排序 B. 冒泡排序 C. 归并排序 D. 堆排序 10. 设树的度为4,其中度为1,2,3,4的结点个数分别为4, 2, ,1, 1, 则T 中的叶子数为 ( )。 A .5 B .6 C .7 D .8 三、 判断题(10分,每小题1分) 1. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。( ) 2. 数组不适合作任何二叉树的存储结构。( ) 3. 广义表的取表尾运算,其结果通常是个表,但有时也可是个原子。( ) 4. 在含有n 个结点的树中,边数只能是n-1条。( ) 5. 所谓一个排序算法是否稳定,是指该算法在各种情况下的效率是否相差不大。( ) 6. 简单选择排序在最好情况下的时间复杂度为O(n)。( ) 7. 在二叉排序树中插入一个新结点,总是插入到叶结点下面。( ) 8. 采用线性探测处理冲突,当从哈希表中删除一个记录时,不应将该记录所在位置置 空,因为这会影响以后的查找。( ) 9. 有n 个数存放在一维数组A[1..n]中,在进行顺序查找时,这n 个数的排列有序或无 ?????? ? ???? ? ??=n n n n a a a a a a A ,2,1,2 ,21,21 ,1Λ Λ

数据结构算法面试100题

数据结构+算法面试100题~~~摘自CSDN,作者July 1.把二元查找树转变成排序的双向链表(树) 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / / 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树节点的数据结构如下: struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node }; 2.设计包含min函数的栈(栈) 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 参见C:\Users\Administrator\Desktop\demo\Stack 分析:min时间复杂度要达到O(1),需要我们在栈中存储最小元素 3.求子数组的最大和(数组) 题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。 分析:根据dp思想 #include #define N 8 int main() { int i, a[N] = {1, -2, 3, 10, -4, 7, 2, -5}; int from[N], result[N], max;

数据结构与算法分析习题与参考答案

大学 《数据结构与算法分析》课程 习题及参考答案 模拟试卷一 一、单选题(每题 2 分,共20分) 1.以下数据结构中哪一个是线性结构?( ) A. 有向图 B. 队列 C. 线索二叉树 D. B树 2.在一个单链表HL中,若要在当前由指针p指向的结点后面插入一个由q指向的结点, 则执行如下( )语句序列。 A. p=q; p->next=q; B. p->next=q; q->next=p; C. p->next=q->next; p=q; D. q->next=p->next; p->next=q; 3.以下哪一个不是队列的基本运算?() A. 在队列第i个元素之后插入一个元素 B. 从队头删除一个元素 C. 判断一个队列是否为空 D.读取队头元素的值 4.字符A、B、C依次进入一个栈,按出栈的先后顺序组成不同的字符串,至多可以组成( ) 个不同的字符串? A.14 B.5 C.6 D.8 5.由权值分别为3,8,6,2的叶子生成一棵哈夫曼树,它的带权路径长度为( )。 以下6-8题基于图1。 6.该二叉树结点的前序遍历的序列为( )。 A.E、G、F、A、C、D、B B.E、A、G、C、F、B、D C.E、A、C、B、D、G、F D.E、G、A、C、D、F、B 7.该二叉树结点的中序遍历的序列为( )。 A. A、B、C、D、E、G、F B. E、A、G、C、F、B、D C. E、A、C、B、D、G、F E.B、D、C、A、F、G、E 8.该二叉树的按层遍历的序列为( )。

A.E、G、F、A、C、D、B B. E、A、C、B、D、G、F C. E、A、G、C、F、B、D D. E、G、A、C、D、F、B 9.下面关于图的存储的叙述中正确的是( )。 A.用邻接表法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关 B.用邻接表法存储图,占用的存储空间大小与图中边数和结点个数都有关 C. 用邻接矩阵法存储图,占用的存储空间大小与图中结点个数和边数都有关 D.用邻接矩阵法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关 10.设有关键码序列(q,g,m,z,a,n,p,x,h),下面哪一个序列是从上述序列出发建 堆的结果?( ) A. a,g,h,m,n,p,q,x,z B. a,g,m,h,q,n,p,x,z C. g,m,q,a,n,p,x,h,z D. h,g,m,p,a,n,q,x,z 二、填空题(每空1分,共26分) 1.数据的物理结构被分为_________、________、__________和___________四种。 2.对于一个长度为n的顺序存储的线性表,在表头插入元素的时间复杂度为_________, 在表尾插入元素的时间复杂度为____________。 3.向一个由HS指向的链栈中插入一个结点时p时,需要执行的操作是________________; 删除一个结点时,需要执行的操作是______________________________(假设栈不空而 且无需回收被删除结点)。 4.对于一棵具有n个结点的二叉树,一个结点的编号为i(1≤i≤n),若它有左孩子则左 孩子结点的编号为________,若它有右孩子,则右孩子结点的编号为________,若它有 双亲,则双亲结点的编号为________。 5.当向一个大根堆插入一个具有最大值的元素时,需要逐层_________调整,直到被调整 到____________位置为止。 6.以二分查找方法从长度为10的有序表中查找一个元素时,平均查找长度为________。 7.表示图的三种常用的存储结构为_____________、____________和_______________。 8.对于线性表(70,34,55,23,65,41,20)进行散列存储时,若选用H(K)=K %7 作为散列函数,则散列地址为0的元素有________个,散列地址为6的有_______个。 9.在归并排序中,进行每趟归并的时间复杂度为______,整个排序过程的时间复杂度为 ____________,空间复杂度为___________。 10.在一棵m阶B_树上,每个非树根结点的关键字数目最少为________个,最多为________ 个,其子树数目最少为________,最多为________。 三、运算题(每题 6 分,共24分) 1.写出下列中缀表达式的后缀形式: (1)3X/(Y-2)+1 (2)2+X*(Y+3) 2.试对图2中的二叉树画出其: (1)顺序存储表示的示意图; (2)二叉链表存储表示的示意图。 3.判断以下序列是否是小根堆? 如果不是, 将它调 图2 整为小根堆。 (1){ 12, 70, 33, 65, 24, 56, 48, 92, 86, 33 } (2){ 05, 23, 20, 28, 40, 38, 29, 61, 35, 76, 47, 100 } 4.已知一个图的顶点集V和边集E分别为: V={1,2,3,4,5,6,7};

典型数据结构面试题

数据结构 1?在一个单链表中p所指结点之前插入一个s (值为e)所指结点时,可执行如下操作: q=head; while (q->next!=p)q=q->next; s= newNode;s->data=e; q->next=;// 填空 s->next=;// 填空 2.线性表的顺序存储结构是一种的存储结构,而链式存储结构是一种___的 存储结构。 A.随机存取 B.索引存取 C.顺序存取 D.散列存取 3.线性表若采用链式存储结构时,要求内存中可用存储单元的地址___。 A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续或不连续都可以 4?在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p 之间插入s结点,则执行_。 A.s->next=p->next;p->next=s; B.p->next=s->next;s->next=p;

C.q->next=s;s->next=p; D.p->next=s;s->next=q; 5.在一个单链表中,若p 所指结点不是最后结点,在p 之后插入s 所指结点,则执行__。 A.s->next=p;p->next=s; B.s->next=p->next;p->next=s; C.s->next=p->next;p=s; C. p->next=s;s->next=p; 6.在一个单链表中,若删除p 所指结点的后续结点,则执行__。 A.p->next= p->next->next; B.p= p->next;p->next= p->next->nex;t C.p->next= p->next; D.p= p->next->next; 7.链表不具备的特点是__。 A 可随机访问任何一个元素 B 插入、删除操作不需要移动元素 C无需事先估计存储空间大小D所需存储空间与线性表长度成正比 8.以下关于线性表的说法不正确的是。 A 线性表中的数据元素可以是数字、字符、记录等不同类型。 B 线性表中包含的数据元素个数不是任意的。 C 线性表中的每个结点都有且只有一个直接前趋和直接后继。 D 存在这样的线性表:表中各结点都没有直接前趋和直接后继。 9?在一个长度为n的顺序表中删除第i个元素,要移动个元素。如果要在第 i 个元素前插入一个元素,要后移()个元素。N-I N-I+1

数据结构与算法试题

数据结构与算法试题 一、单选题 1、在数据结构的讨论中把数据结构从逻辑上分为 (C ) A 内部结构与外部结构 B 静态结构与动态结构 C 线性结构与非线性结构 D 紧凑结构与非紧凑结构。 2、采用线性链表表示一个向量时,要求占用的存储空间地址(D ) A 必须就是连续的 B 部分地址必须就是连续的 C 一定就是不连续的 D 可连续可不连续 3、采用顺序搜索方法查找长度为n的顺序表时,搜索成功的平均搜索长度为( D )。 A n B n/2 C (n-1)/2 D (n+1)/2 4、在一个单链表中,若q结点就是p结点的前驱结点,若在q与p之间插入结点s,则执行( D )。 A s→link = p→link;p→link = s; B p→link = s; s→link = q; C p→link = s→link;s→link = p; D q→link = s;s→link = p; 5、如果想在4092个数据中只需要选择其中最小的5个,采用( C )方法最好。 A 起泡排序 B 堆排序 C 锦标赛排序 D 快速排序 6、设有两个串t与p,求p在t中首次出现的位置的运算叫做( B )。 A 求子串 B 模式匹配 C 串替换 D 串连接 7、在数组A中,每一个数组元素A[i][j]占用3个存储字,行下标i从1到8,列下标j从1到10。所有数组元素相继存放于一个连续的存储空间中,则存放该数

组至少需要的存储字数就是( C )。 A 80 B 100 C 240 D 270 8、将一个递归算法改为对应的非递归算法时,通常需要使用( A )。 A 栈 B 队列 C 循环队列 D 优先队列 9、一个队列的进队列顺序就是1, 2, 3, 4,则出队列顺序为( C )。 10、在循环队列中用数组A[0、、m-1] 存放队列元素,其队头与队尾指针分别为front与rear,则当前队列中的元素个数就是( D )。 A ( front - rear + 1) % m B ( rear - front + 1) % m C ( front - rear + m) % m D ( rear - front + m) % m 11、一个数组元素a[i]与( A )的表示等价。 A *(a+i) B a+i C *a+i D &a+i 12、若需要利用形参直接访问实参,则应把形参变量说明为( B )参数。 A 指针 B 引用 C 值 D 变量 13、下面程序段的时间复杂度为( C ) for (int i=0;i

数据结构与算法试卷(B卷)

广西科技大学2015 —2016 学年第 1 学期课程考核试题试卷 考核课程数据结构与算法( B 卷)考核班级物联网141 学生数36 印数40 考核方式闭卷考核时间120 分钟 一、单项选择题(在每小题的四个备选答案中,选出一个正确答案。每小题1分,共33分) 1、算法是()。 A. 计算机程序 B. 解决问题的计算方法 C. 排序算法 D. 解决问题的有限运算序列 2、一个顺序表的第一个元素的存储地址是90,每个元素的长度为2,则第8个元素的存储地址是()。 A. 102 B. 104 C. 106 D. 108 3、在一个长度为n的顺序表中删除第i个元素,需要向前移动()个元素。 A. n-i B. n-i+1 C. n-i-1 D. i+1 4、在头指针为head且表长大于1的单循环链表中,指针p指向表中某个结点,若p->next->next==head,则()。 A. p指向头结点 B. p指向尾结点 C. p的直接后继是头结点 D. p的直接后继是尾结点 5、在以下的叙述中,正确的是()。 A. 线性表的顺序存储结构优于链表存储结构 B. 线性表的顺序存储结构适用于频繁插入/删除数据元素的情况 C. 线性表的链表存储结构适用于频繁插入/删除数据元素的情况 D. 线性表的链表存储结构优于顺序存储结构 6、在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入一个结点s,则执行()。 A. s->next=p->next; p->next=s; B. p->next=s->next; s->next=p; C. q->next=s; s->next=p; D. p->next=s; s->next=q; 7、在双向循环链表中,在p指针所指的结点后插入一个指针q所指向的新结点,修改指针的操作是()。 A. p->next=q; q->prior=p; p->next->prior=q; q->next=q; B. p->next=q; p->next->prior=q; q->prior=p; q->next=p->next; C. q->prior=p; q->next=p->next; p->next->prior=q; p->next=q; D. q->next=p->next; q->prior=p; p->next=q; p->next=q; 8、在单链表中,指针p指向元素为x的结点,实现删除x的后继的语句是()。 A. p=p->next; B. p->next=p->next->next; C. p->next=p; D.p=p->next->next; 9、在表长为n的顺序表中,当在任何位置删除一个元素的概率相同时,删除一个元素所需移动的平均个数为()。 A. (n-1)/2 B. n/2 C. (n+1)/2 D. n 10、将长度为n的单链表连接在长度为m的单链表之后的算法的时间复杂度为()。 A. O(1) B. O(n) C. O(m) D. O(m+n) 11、线性表的顺序存储结构是一种()存储结构。 A. 随机存取 B. 顺序存取 C. 索引存取 D. 散列存取 12、循环链表的主要优点是()。 A. 不再需要头指针 B. 已知某结点位置后能容易找到其直接前驱 C. 在进行插入、删除运算时能保证链表不断开 D. 在表中任一结点出发都能扫描整个链表 13、在下列对顺序表进行的操作中,算法时间复杂度为O(1)的是()。

数据结构与算法上海第二工业大学二工大期末考试试卷

选择题: 1、在数据结构中,线性结构中元素之间存在____关系。 A: 一对一 B: 一对多 C: 多对一 D: 多对多 2、数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的____和运算等的学科。 A: 结构 B: 关系 C: 操作 D: 算法 3、算法分析的两个主要方面是____。 A: 空间复杂度和时间复杂度 B: 正确性和简明性 C: 可读性和文档性 D: 数据复杂性和程序复杂性 4、顺序表中逻辑上相邻的节点其物理位置也____。 A: 一定相邻 B: 不必相邻 C: 按某种规律排列 D: 无要求 5、在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入s结点,则执行____。 A: s->next=p->next; p->next=s; B: p->next=s->next; s->next=p; C: q->next=s; s->next=p; D: p->next=s; s->next=q; 6、一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是____。 A: edcba B: decba C: dceab D: abcde 7、循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear,则当前队列中的元素个数是____。 A: (rear-front+m)%m B: rear-front+1 C: rear-front-1 D: rear-front 8、关于空格串,下列说法中正确的有____。 A: 空格串就是空串

B: 空格串是零个字符的串 C: 空格串的长度为零 D: 空格串的长度就是其包含的空格个数 9、数组A中,每个元素A的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A[8][5]的起始地址为____。A: SA+140 B: SA+144 C: SA+222 D: SA+225 10、对于一棵满二叉树,m个树叶,n个节点,深度为h,则____。 A: n=h+m B: h+m=2n C: m=h-1 D: n=2h-1 11、具有65个结点的完全二叉树其深度为____。(根的层次号为1) A: 8 B: 7 C: 6 D: 5 12、满二叉树____二叉树。 A: 一定是完全 B: 不一定是完全 C: 不是 D: 不是完全 13、将一棵有100个节点的完全二叉树从上到下,从左到右依次对节点进行编号,根节点的编号为1,则编号为49的节点的左孩子编号为____。 A: 99 B: 98 C: 50 D: 48 14、如果T2是由森林T转换而来的二叉树,那么T中结点的后序遍历就是T2中结点的____。A: 先序遍历 B: 中序遍历 C: 后序遍历 D: 层次遍历 15、将递归算法转换成对应的非递归算法时,通常需要使用____。 A: 栈 B: 队列 C: 链表 D: 树 16、如果某二叉树的前序为stuwv,中序为uwtvs,那么该二叉树的后序为____。 A: uwvts B: vwuts C: wuvts

22道数据结构算法面试题

微软的22道数据结构算法面试题(含答案)1、反转一个链表。循环算法。 1 List reverse(List l) { 2 if(!l) return l; 3 list cur = l.next; 4 list pre = l; 5 list tmp; 6 pre.next = null; 7 while ( cur ) { 8 tmp = cur; 9 cur = cur.next; 10 tmp.next = pre; 11 pre = tmp; 12 } 13 return tmp; 14 } 2、反转一个链表。递归算法。 1 List resverse(list l) { 2 if(!l || !l.next) return l; 3 4 List n = reverse(l.next); 5 l.next.next = l; 6 l.next=null; 7 } 8 return n; 9 } 3、广度优先遍历二叉树。 1 void BST(Tree t) { 2 Queue q = new Queue(); 3 q.enque(t); 4 Tree t = q.deque(); 5 while(t) { 6 System.out.println(t.value); 7 q.enque(t.left);

9 t = q.deque(); 10 } 11 } ---------------------- 1class Node { 2 Tree t; 3 Node next; 4 } 5class Queue { 6 Node head; 7 Node tail; 8 public void enque(Tree t){ 9 Node n = new Node(); 10 n.t = t; 11 if(!tail){ 12 tail = head = n; 13 } else { 14 tail.next = n; 15 tail = n; 16 } 17 } 18 public Tree deque() { 19 if (!head) { 20 return null; 21 } else { 22 Node n = head; 23 head = head.next; 24 return n.t; 25 } 26} 4、输出一个字符串所有排列。注意有重复字符。 1char[] p; 2void perm(char s[], int i, int n){ 3 int j; 4 char temp; 5 for(j=0;j

相关文档
相关文档 最新文档