数据结构马睿孙丽云习题答案Word文档格式.docx

上传人:b****6 文档编号:17728170 上传时间:2022-12-08 格式:DOCX 页数:26 大小:165.58KB
下载 相关 举报
数据结构马睿孙丽云习题答案Word文档格式.docx_第1页
第1页 / 共26页
数据结构马睿孙丽云习题答案Word文档格式.docx_第2页
第2页 / 共26页
数据结构马睿孙丽云习题答案Word文档格式.docx_第3页
第3页 / 共26页
数据结构马睿孙丽云习题答案Word文档格式.docx_第4页
第4页 / 共26页
数据结构马睿孙丽云习题答案Word文档格式.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

数据结构马睿孙丽云习题答案Word文档格式.docx

《数据结构马睿孙丽云习题答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构马睿孙丽云习题答案Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。

数据结构马睿孙丽云习题答案Word文档格式.docx

6、a2,a4,a1,a2,2

7、先进后出,加1,减1

8、满,空,n

9、线性结构

10、4

三、判断题

1.、错

2、错

3、对

4、错

5、对

6、错

7、错

四、解答题

4、列车进入一个栈式结构的车站,开出车站有14可能的顺序:

abcd;

abdc

adcb

acdb,acbd

bdca,

bcda,bcad

bacd,badc

cdba,

cbda,cbad,

dcba

列车进入一个队列式结构的车站,开出车站有1可能的顺序:

abcd

5、6,24

7、staxy

8、char

9、第一个循环:

队列Q中的元素依次出队,出队后即进栈S

第二个循环:

栈S中的元素依次出栈,出栈后即进入队列Q

第4章串

1、A2、D3、C4、C5、D

二、简答题

1、含零个字符的串称为空串,用Φ表示,串的长度为0。

而空格串是由一个或多个空格组成的串,串的长度为所含空格的个数。

由串中任意连续字符组成的子序列称为该串的子串。

包含子串的串相应地被称为主串。

假如一个串S=“a0a1a2…an-1”(n≥0),其中:

S为串名,用双引号括起来的内容为串的值,双引号本身不是串的值。

2、当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,两个串才相等。

3、19,7,good,e,0,3,”Iamagoodteacher”,”agoodyestea”

4、

j

1

2

3

4

5

6

模式串

a

b

c

next[j]

-1

三、算法题

1、

voidAssign(string*s,stringt)∴n=(676-2-644)/2=15

∴Loc(3,3)=Loc(0,0)+3*15+3=644+45+3=692.

2、

(1)数组B共有1+2+3+?

?

+n=(n+1)*n/2个元素。

(2)只存下三角部分时,若i?

j,则数组元素A[i][j]前面有i-1行(1?

i-1,第0行第0列不算),第1行有1个元素,第2行有2个元素,?

,第i-1行有i-1个元素。

在第i行中,第j号元素排在第j个元素位置,因此,数组元素A[i][j]在数组B中的存放位置为:

1+2+?

+(i-1)+j=(i-1)*i/2+j

若i<

j,数组元素A[i][j]在数组B中没有存放,可以找它的对称元素A[j][i]。

在数组B的第(j-1)*j/2+i位置中找到。

如果第0行第0列也计入,数组B从0号位置开始存放,则数组元素A[i][j]在数组B中的存放位置可以改为:

当i?

j时,=i*(i+1)/2+j

当i<

j时,=j*(j+1)/2+i

3、

(1)Head(Tail(Tail(L1)))

(2)Head(Head(Tail(L2)))

(3)Head(Head(Tail(Tail(Head(L3)))))

(4)Head(Head(Tail(Tail(L4))))

(5)Head(Tail(Head(L5)))

(6)Head(Head(Tail(Head(Tail(L6)))))

4、由于线性表中的每个结点对应稀疏矩阵的一个非零元素,其中包括3个字段,分别为该元素的行下标、列下标和值,结点间的次序按矩阵的行优先顺序排列,这个线性表用顺序的方法存储在连续的存储区,则对应的三元组为

其十字链表形式为:

5、

6、L=(a,(b,c),(d,(e)))

四、算法题

1、【算法分析】从前向后找零元素A[i],从后向前找非零元素A[j],将A[i]与A[j]交换。

【算法源代码】

voidmove(intA[],intn)

{inti=0,j=n-1;

inttemp;

while(i<

j)

{

while(A[i]!

=0)i++;

while(A[j]==0)j--;

if(i<

{temp=A[i];

A[i]=A[j];

A[j]=temp;

}

}

}

2、【算法分析】为保证算法的时间复杂度为O(m+n),即需要对数组A和B的数据元素仅扫描一次就能生成C数组,我们可采用设三个下标指针i,j,k初始时分别指向A数组的最后一个元素(A数组的最大值)、B数组的第一个元素(B数组的最大值)、C数组将存放最大值的位置,然后比较A与B数组的最大值大者放C数组k所指单元;

在上述比较中若A数组i所指单元数大,则送完后i前移,否则j所指单元数送完后j后移,同时k前移,直到把A与B数组的所有元素扫描完。

#definem3

#definen4

voidMerge(intA[],intB[],intC[])

{inti,j,k;

i=m-1;

j=0;

k=m+n-1;

while((i>

=0)&

&

(j<

=n-1))

{if(A[i]>

B[j])

{C[k]=A[i];

i--;

else

{C[k]=B[j];

j++;

k--;

while(i>

=0){C[k]=A[i];

i--;

k--;

while(j<

=n-1){C[k]=B[j];

j++;

}

3、【算法分析】三元组表示中要求按行的顺序存放,所有转置过程不能直接将行下标和列下标转换,还必须使得列按顺序存放。

因此在A中首先找出第一列中的所有元素,它们是转置矩阵中第一行非0元素,并把它们依次放在转置矩阵三元组数组B中;

然后依次找出第二列中的所有元素,把它们依次放在数组B中;

按照同样的方法逐列进行,直到找出第n列的所有元素,并把它们依次放在数组B中。

voidtranspose(TSMatrixA,TSMatrix*B)

/*A是稀疏矩阵的三元组形式,B是存放A的转置矩阵的三元组数组*/

{inti,j,k;

B->

mu=;

nu=;

tu=;

if(B->

tu>

0)

{j=1;

for(k=1;

k<

=;

k++)

for(i=1;

i<

i++)

if[i].col==k)

{B->

data[j].row=[i].col;

B->

data[j].col=[i].row;

data[j].e=[i].e;

4、【算法分析】在求广义表深度的递归算法中,若结点为原子则深度为0,若是空表深度为1,否则返回头指针与尾指针所指广义表的深度最大值。

intGlist_Getdeph(GlistL)

{intm,n;

if(!

L->

tag)return0;

elseif(!

L)return1;

m=Glist_Getdeph(L->

+1;

n=Glist_Getdeph(L->

;

returnm>

n?

n:

n;

第6章树

一.选择题

1、B2、A3、B4、A5、C6、CA7、B8、B9、D10、B

11、B12、B13、B14、A15、C16、D17、A18、A19、C20、D

二.填空题

1.[1]前驱[2]一个前驱结点[3]后继[4]后继

2.n-1

3.n0=n2+1

4.[1]2[2]10[3]11

5.[1]A[2]DGF[3]BE[4]AC[5]B

[6]ACE[7]右[8]左[9]2[10]4

6.250

7.1

8.2n0-1

9.[1]D[2]F

10.[1]GEACBDF[2]1

11.[1]InOrderTraverse(T->

left)[2]printf(T->

data)[3]InOrderTraverse(T->

right)

12.

三.判断题

3.√4.×

5.×

6.√7.×

8.√9.×

10.√

四.操作题

1.

(1)

(2)GCABFED

(3)

(4)(5)

(6)

2.

3.

(1)所有结点均没有左孩子的二叉树。

(2)所有结点均没有右孩子的二叉树

(3)只有一个根结点的二叉树

4.证明:

当n=1时,前序序列和中序序列均只有一个元素且相同,即为根,由此唯一地确定了这颗二叉树。

假设n<

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

设前序序列为:

a1,a2,…,am,中序序列为:

b1,b2,…,bm。

因为前序序列由前序遍历得到,则a1为根结点元素;

又中序序列由中序遍历得到,则在中序序列中必能找到和a1相同的元素并设为bj(1≤j≤m),由此可得{b1,…,bj-1}为左子树的中序序列,{bj+1,…,bm}为右子树的中序序列。

(1)若j=1即b1为根,此时二叉树的左子树为空,{a2,…,am}即为右子树的前序序列,{b2,…,bm}即为右子树的中序序列,右子树的结点数为m-1,由此,这两个序列唯一确定了右子树,也唯一确定了二叉树。

(2)若j=m即bm为根,此时二叉树的右子树为空,{a2,…,am}即为左子树的前序序列,{b2,…,bm}即为左子树的中序序列,同

(1),这两个序列唯一确定了左子树,也唯一确定了二叉树。

(3)2≤j≤m-1,则子序列{a2,…,aj}和{b1,…,bj-1}分别为左子树的前序序列和中序序列,这两个序列唯一确定了左子树;

子序列{aj+1,…,am}和{bj+1,…,bm}分别为右子树的前序序列和中序序列,这两个序列唯一确定了右子树;

由此,证明了知道一棵二叉树的前序序列和中序序列,就能唯一地确定一棵二叉树。

5.

6.

7.

8.

F

五.算法设计题

=p;

p=p->

lchild;

if(top!

=-1)returnstack[top].T;

elsereturnNULL;

BiThrNode*PreOrder_Next(BiThrNode*p){

n"

);

v=0;

}

else{

p=(q->

front)->

(q->

next=p->

if(p->

next==NULL)q->

rear=q->

front;

v=p->

T;

free(p);

returnv;

voidvisite(LINKQUEUE*q,BiTreep)

{if(p!

=NULL)

{printf("

%c"

p->

data);

enlinkqueue(q,p);

voidLevel_Traverse(BiTreeT)/*按层次遍历二叉树*/

{LINKQUEUEQue,*Q;

BiTreep;

Q=&

Que;

initlinkqueue(Q);

if(T!

=NULL)

{visite(Q,T);

while(!

emptylinkqueue(Q))

{p=dellinkqueue(Q);

visite(Q,p->

lchild);

rchild);

printf("

ThepointerwhichpointsatthelastNodeis%x\n"

p);

/*给出离根结点最远的一个结点(即最后一个出队的结点)的指针*/

intNode(BiTreeT)

{/*求以孩子兄弟链表存储的树或森林T中的结点数,并通过函数值返回*/

intcount;

BiTreeT1;

if(T==NULL)return0;

/*bt为空时,结点数为0*/

elseif(T->

firstchild==NULL)return1;

else{

count=0;

T1=T->

firstchild;

while(T1)

{count=cout+Node(T1);

T1=T1->

nextsibling?

returncount?

9.

intHigh(BiTreeT)

{/*求以孩子兄弟链表存储的树或森林T的高度,并通过函数值返回*/

inth1,h2;

h1=High(T->

firstchild)+1;

h2=High(T->

nextsibling);

returnh1>

h2?

h1:

h2;

10.

charPred,Midd;

.

Build_Sub(1,n,1,n);

分析:

本算法利用了这样一个性质,即一棵子树在前序和中序序列中所占的位置总是连续的.因此,就可以用起始下标和终止下标来确定一棵子树.Pre_Start,Pre_End,Mid_Start和Mid_End分别指示子树在前序子序列里的起始下标,终止下标,和在中序子序列里的起始和终止下标.

第7章图

1.B2.B3.B和C4.D和E5.C6.D7.A8.A9.D10.B

1.[1]n(n-1)[2]n(n-2)/2[3]n-1

2.[1]ABCDFE[2]ABCEFD

3.[1]按深度[2]按广度

4.极大

5.图本身

6.主对角线

7.[1]i[2]j

8.[1]n-1[2]大于n-1[3]小于n-1

9.20

10.[1]n+2e[2]2e[3]n

11.[1]n+e[2]e[3]n

12.无环

2.√3.√4.×

6.×

7.×

8.×

四、(略)

五、(略)

第8章查找

1、C2、B3、A4、C5、C6、D7、B8、B9、B10、D

11、C12、C13、D14、D15、D16、C17、A18、B19、D20、B

1.【答案】错误

【分析】顺序查找并没有假设数有序或者无序,因此有序或无序对平均查找长度没有影响。

2.【答案】错误

3.【答案】正确

4.【答案】错误

【分析】链表表示的有序表不能用折半查找法查找。

5.【答案】错误

6.【答案】错误

【分析】最优二叉树是静态树表,AVL是动态树表,二者范围不同。

7.【答案】正确

8.【答案】正确

9.【答案】正确

10.【答案】正确

11.【答案】错误

【分析】除非被删除的结点是叶子结点,否则删除后再插入同一结点得到的二叉排序树与原来的二叉排序树不同。

12.【答案】错误

13.【答案】错误

14.【答案】错误

15.【答案】正确

16.【答案】正确

17.【答案】错误

【分析】а越小,只能说发生冲突的可能性越小,但依然有可能发生冲突。

18.【答案】正确

19.【答案】正确

20.【答案】正确

三、填空题

1.【分析】最优二叉树是对叶子结点带权平均查找路径长度最小的树,最优查找树是对所有结点带权查找路径长度最小的树,构造这两种树均需要知道关键字的查找概率。

【解答】①叶子结点数②结点数③需要n个关键字的查找概率表

2.【分析】折半查找法在查找成功与不成功时进行比较的关键字个数最多不超过树的深度,而具有n个结点的判定树的深度为?

log2n」+1,所以,最大比较次数为?

log2n」+1。

【答案】?

log2n」+1

3.【分析】平均检索长度ASLss=(s+n/s)/2+1,所以当S=

时,ASLss取得最小值

+1。

【解答】①16②17③21

4.【分析】第4层是叶子结点,每个结点两个关键字,2×

1+2×

31+2×

32=26。

【答案】26

四、简答题

1.【解答】判定树如下所示:

等概率查找时成功的平均查找长度为ASLsucc=

(1×

1+2×

2+3×

4+4×

3)=

2.【解答】

(1)按关键字的顺序构造的二叉排序树:

(2)根据构造的二叉排序树,求查找成功时的平均查找长度:

ASLSUCC=(1*1+2*2+3*3+4*3+5*2+6*1)/12=

(3)若对表中元素先进行排序构成有序表再构造二叉排序树,则构造的二叉排序树是一棵单支树,在等概率的情况下查找成功的平均查找长度则为:

ASLSUCC=(1+2+…+12)/12=

这种情况就退化成为顺序查找。

3.【解答】

4.【解答】

5.【解答】令Fk表示含有最少结点的深度为k的平衡二叉树的结点数目。

那么,可知道F1=1,F2=2,.....Fn=Fn-2+Fn-1+1.

含有12个结点的平衡二叉树的最大深度为5.例如:

6.【解答】4个、7个。

7.【解答】

8.【分析】主要考察用线性探测再散列法和链地址法构造哈希表。

哈希表的装填因子定义为:

α=表中添入的记录数/哈希表的长度

【解答】

①使用线性探测再散列法来构造哈希表见下表:

地址

012345678910

数据

331131234382722

hashf1

(1)=1hashf1(13)=2

hashf1(12)=1hashf2(12)=(1+1)%11=2hashf3(12)=(1+2)%11=3

hashf1(34)=3hashf2(34)=(3+1)%11=4

hashf1(38)=5hashf1(33)=0

hashf1(27)=5hashf2(27)=(5+1)%11=6

hashf1(22)=0hashf2(22)=(0+1)%11=1hashf3(22)=2hashf4(22)=3

hashf5(22)=4hashf6(22)=5hashf7(22)=6hashf8(22)=7

装填因子?

=8/11

查找成功所需的平均查找次数:

(1+1+3+2+1+1+2+8)/8=19/8

②使用链地址法来构造哈希表如下图所示:

(1*3+2*3+3*1)/8=3/2

9.【解答】

(1)

7

8

9

10

11

12

13

14

15

16

Apr

Aug

Dec

Feb

Jan

Mar

May

June

July

Sep

Oct

Nov

平均查找长度为:

31/12

(2)

^

3/2

五、算法设计题

1.【分析】算法思想:

先遍历右子树后遍历左子树。

【解答】算法如下:

Inorder(BiSTreebt,datatypeX)

{if(bt)

{Inorder(bt->

rchild,X);

if(bt->

data>

=X)printf(“%c”,bt->

Inorder(bt->

lchild,X);

2.【分析】在合并过程中,并不释放或新建任何结点,而是采取修改指针的方式来完成合并,这样,就必须按照后序序列把一棵树中元素逐个连接到另一棵树上,否则将会导致树的结构的混乱。

voidBiTMerge(BiSTree*T,BiSTree*S)/*把二叉排序树合并到T中*/

{if(S->

lchild)BiTMerge(T,S->

if(S->

rchild)BiTMerge(T,S->

rchild)/*合并子树*/

Insert_Node(T,S);

voidInsert(BiSTree*T,BiSTNode*S)/*把树结点S插入到T的合适位置*/

T->

data)

{if(!

rchild)T->

rchild=S;

elseInsert(T->

rchild,S);

elseif(S->

data<

lchild)T->

lchild=S;

lchild,S);

S->

lchild=NULL;

/*插入的新结点必须和原来的左右子树断绝关系*/

rchild=NULL;

/*否则会导致树结构的混乱*/

3.【分析】算法思想;

以x为分界点遍历原二叉树并构造两棵新的二叉排序树。

【解答】算法如下:

voidBiTSplit(BiSTree*T,BiSTree*A,BiSTree*B,intx)

/*把二叉排序树T分裂为两棵二叉排序树A和B,其中A的元素全部小于等于x,B的元素全部大于x*/

{if(T->

lchild)BiTSplit(T->

lchild,A,B,x);

if(T->

rchild)BiTSplit(T->

rchild,A,B,x);

/*分裂左右子树*/

=x)Insert(A,T);

elseInsert(B,T);

/*将元素结点插入到T的合适位置上*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 初中作文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1