ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:165.58KB ,
资源ID:4782970      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4782970.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构马睿孙丽云习题答案.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构马睿孙丽云习题答案.docx

1、数据结构马睿孙丽云习题答案 第1章 绪论一、选择题1、C 2、C 3、C 4、D 5、B 6、C二、判断题1 2 3 4 5 6三、简答题(略)四、算法分析题:1.分析下列程序段中带标号“#”语句的执行频度(n为正整数)。(1)频度: n,时间复杂度:O(n)(2)频度: 1,时间复杂度:O(1)(3)频度: n2,时间复杂度:O(n2)(4)频度: n/2-1,时间复杂度:O(n)(5)频度: 11002写出下列各程序段关于n的时间复杂度。(1)O(log3n)(2)O(n2)(3)O(n2)第2章 线性表一、选择题1、A 4. D 5. C 7. A 二、填空题1.、线性表2、前驱,后继3

2、、p-next; s-data; t4、q-next5、head-next = NULL6、p-next, s7、p-next != p8、 O(1), O(n)第3章 栈和队列一、选择题1、C 10. D 二、填空题1.、n-12、O(n)3、135424、2xy+1x-/*5、36、a2, a4, a1, a2, 27、先进后出,加1, 减18、满,空,n9、线性结构10、4三、判断题1.、错2、错3、对4、错5、对6、错7、错四、解答题4、列车进入一个栈式结构的车站,开出车站有 14 可能的顺序:abcd; abdcadcbacdb, acbdbdca,bcda, bcadbacd, b

3、adccdba,cbda, cbad,dcba列车进入一个队列式结构的车站,开出车站有 1 可能的顺序:abcd5、6, 247、staxy8、char9、第一个循环:队列Q中的元素依次出队,出队后即进栈S第二个循环:栈S中的元素依次出栈,出栈后即进入队列Q第4章 串一、选择题1、A 2、D 3、C 4、C 5、D二、简答题1、含零个字符的串称为空串,用表示,串的长度为0。而空格串是由一个或多个空格组成的串,串的长度为所含空格的个数。由串中任意连续字符组成的子序列称为该串的子串。包含子串的串相应地被称为主串。假如一个串S=“a0a1a2an-1”(n0),其中:S为串名,用双引号括起来的内容为

4、串的值,双引号本身不是串的值。2、当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,两个串才相等。3、19,7,good,e,0,3,”I am a good teacher”,”a goodyestea”4、j0123456模式串abcabaanextj-1000121三、算法题1、void Assign(string *s, string t) n = ( 676 - 2 - 644 ) / 2 = 15 Loc ( 3, 3 ) = Loc ( 0, 0 ) + 3 * 15 + 3 = 644 + 45 + 3 = 692.2、(1) 数组B共有12 + 3 +? + n= (

5、 n+1 )*n / 2个元素。 (2) 只存下三角部分时,若i ? j,则数组元素Aij前面有i-1行(1?i-1,第0行第0列不算),第1行有1个元素,第2行有2个元素,?,第i-1行有i-1个元素。在第i行中,第j号元素排在第j个元素位置,因此,数组元素Aij在数组B中的存放位置为:1 + 2 + ? + (i-1) + j = ( i-1)*i / 2 + j若i j,数组元素Aij在数组B中没有存放,可以找它的对称元素Aji。在数组B的第 (j-1)*j / 2 + i位置中找到。如果第0行第0列也计入,数组B从0号位置开始存放,则数组元素Aij在数组B中的存放位置可以改为:当i ?

6、 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个字

7、段,分别为该元素的行下标、列下标和值,结点间的次序按矩阵的行优先顺序排列,这个线性表用顺序的方法存储在连续的存储区,则对应的三元组为其十字链表形式为:5、 6、L=(a,(b,c),(d,(e)四、算法题1、【算法分析】从前向后找零元素Ai,从后向前找非零元素Aj,将Ai与Aj交换。【算法源代码】void move(int A,int n)int i=0,j=n-1;int temp;while(ij) while(Ai!=0) i+; while(Aj=0) j-; if(i=0)&(jBj) Ck=Ai; i-; else Ck=Bj; j+; k-; while(i=0) Ck=Ai;i

8、-;k-; while(jmu=;B-nu=;B-tu=;if(B-tu0) j=1; for(k=1;k=;k+) for(i=1;idataj.row=i.col; B-dataj.col=i.row; B-dataj.e=i.e; j+; 4、【算法分析】在求广义表深度的递归算法中,若结点为原子则深度为0,若是空表深度为1,否则返回头指针与尾指针所指广义表的深度最大值。【算法源代码】int Glist_Getdeph(Glist L)int m,n; if(!L-tag) return 0; else if(!L) return 1; m=Glist_Getdeph(L-+1; n=Gl

9、ist_Getdeph(L-; return mn?n:n; 第6章 树一选择题1、B 2、A 3、B 4、A 5、C 6、C A 7、B 8、B 9、D 10、B11、B 12、B 13、B 14、A 15、C 16、D 17、A 18、A 19、C 20、D二填空题1 1 前驱 2 一个前驱结点 3 后继 4 后继2. n-1 3. n0=n2 +1 4. 1 2 2 10 3 11 5. 1 A 2 D G F 3 B E 4 A C 5 B 6 A C E 7 右 8 左 9 2 10 46. 2507. 18. 2n0-19. 1 D 2 F10. 1 GEACBDF 2 111.

10、1 InOrderTraverse (T-left) 2 printf(T-data) 3 InOrderTraverse (T-right) 12. 。三判断题1 2 3 4 5 6 7 8 9 10四操作题1(1) (2) GCABFED(3)(4) (5)(6)23(1)所有结点均没有左孩子的二叉树。 (2)所有结点均没有右孩子的二叉树 (3)只有一个根结点的二叉树4 证明: 当n=1时,前序序列和中序序列均只有一个元素且相同,即为根,由此唯一地确定了这颗二叉树。 假设nlchild; if(top != -1) return stacktop.T;else return NULL;6B

11、iThrNode *PreOrder_Next(BiThrNode *p) n);v=0; else p=(q-front)-next; (q-front)-next=p-next; if(p-next=NULL) q-rear=q-front; v=p-T; free(p); return v;void visite(LINKQUEUE *q, BiTree p) if(p!=NULL) printf(%c ,p-data); enlinkqueue(q,p); void Level_Traverse(BiTree T)/*按层次遍历二叉树*/ LINKQUEUE Que,*Q; BiTre

12、e p; Q=&Que; initlinkqueue(Q); if(T!=NULL) visite(Q,T); while(!emptylinkqueue(Q) p=dellinkqueue(Q); visite(Q,p-lchild); visite(Q,p-rchild); printf(The pointer which points at the last Node is %xn,p);/*给出离根结点最远的一个结点(即最后一个出队的结点)的指针*/ 8int Node(BiTree T) /*求以孩子兄弟链表存储的树或森林T中的结点数,并通过函数值返回*/ int count; Bi

13、Tree T1;if(T =NULL) return 0; /*bt为空时,结点数为0*/ else if(T-firstchild =NULL) return 1;else count=0; T1=T-firstchild; while(T1) count=cout+Node(T1);T1=T1-nextsibling?; return count?;9int High(BiTree T) /*求以孩子兄弟链表存储的树或森林T的高度,并通过函数值返回*/ int h1,h2; BiTree T1;if(T =NULL) return 0; /*bt为空时,结点数为0*/else h1=Hig

14、h(T-firstchild)+1;h2=High(T-nextsibling);return h1h2? h1:h2;10char Pred,Midd; . Build_Sub(1,n,1,n); .分析:本算法利用了这样一个性质,即一棵子树在前序和中序序列中所占的位置总是连续的.因此,就可以用起始下标和终止下标来确定一棵子树.Pre_Start,Pre_End,Mid_Start和Mid_End分别指示子树在前序子序列里的起始下标,终止下标,和在中序子序列里的起始和终止下标.第7章 图一、选择题1B 2B 3B和C 4D和E 5 C 6D 7A 8A 9D 10B二、填空题1. 1 n(n

15、-1) 2 n(n-2)/2 3 n-12. 1 ABCDFE 2 ABCEFD3. 1 按深度 2按广度4极大5.图本身6.主对角线7.1 i 2 j 8. 1 n-1 2 大于 n-1 3 小于n-19. 20 10. 1 n+2e 2 2e 3 n11. 1 n+e 2 e 3 n12.无环三、判断题1 2 3 4 5 678四、(略)五、(略)第8章 查找一、选择题1、C 2、B 3、A 4 、C 5、C 6、D 7、B 8、B 9、B 10、D11、C 12、C 13、D 14、D 15、D 16、C 17、A 18、B 19、D 20、B二、判断题1 【答案】错误【分析】顺序查找并

16、没有假设数有序或者无序,因此有序或无序对平均查找长度没有影响。2【答案】错误3【答案】正确4【答案】错误【分析】链表表示的有序表不能用折半查找法查找。5【答案】错误6【答案】错误【分析】最优二叉树是静态树表,AVL是动态树表,二者范围不同。7【答案】正确8【答案】正确9【答案】正确10【答案】正确11【答案】错误【分析】除非被删除的结点是叶子结点,否则删除后再插入同一结点得到的二叉排序树与原来的二叉排序树不同。12【答案】错误13【答案】错误14【答案】错误15【答案】正确16【答案】正确17【答案】错误【分析】越小,只能说发生冲突的可能性越小,但依然有可能发生冲突。18【答案】正确19【答案

17、】正确20【答案】正确三、填空题1【分析】最优二叉树是对叶子结点带权平均查找路径长度最小的树,最优查找树是对所有结点带权查找路径长度最小的树,构造这两种树均需要知道关键字的查找概率。【解答】叶子结点数 结点数 需要n个关键字的查找概率表2【分析】折半查找法在查找成功与不成功时进行比较的关键字个数最多不超过树的深度,而具有n个结点的判定树的深度为?log2n+1,所以,最大比较次数为?log2n+1。【答案】?log2n+1 3【分析】平均检索长度ASLss=(s+n/s)/2+1,所以当S=时,ASLss取得最小值+1。【解答】16 17 214【分析】第4层是叶子结点,每个结点两个关键字,2

18、1231232=26。【答案】26四、简答题1【解答】判定树如下所示:等概率查找时成功的平均查找长度为ASLsucc=(11+22+34+43)=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的平衡二叉树

19、的结点数目。那么,可知道F1=1,F2=2,.Fn=Fn-2+Fn-1+1.含有12个结点的平衡二叉树的最大深度为例如:6【解答】4个、7个。7【解答】8【分析】主要考察用线性探测再散列法和链地址法构造哈希表。哈希表的装填因子定义为:=表中添入的记录数/哈希表的长度 【解答】使用线性探测再散列法来构造哈希表见下表:地址0 1 2 3 4 5 6 7 8 9 10数据33 1 13 12 34 38 27 22hashf1(1)=1 hashf1(13)=2hashf1(12)=1 hashf2(12)(1+1)%11=2 hashf3(12)= (1+2)%11=3hashf1(34)=3 h

20、ashf2(34)=(3+1)%11=4hashf1(38)=5 hashf1(33)=0hashf1(27)=5 hashf2(27)=(5+1)%11=6hashf1(22)=0 hashf2(22)=(0+1)%11=1 hashf3(22)=2 hashf4(22)=3hashf5(22)=4 hashf6(22)=5 hashf7(22)=6 hashf8(22)=7装填因子?8/11查找成功所需的平均查找次数:(1+1+3+2+1+1+2+8)/8=19/8使用链地址法来构造哈希表如下图所示:查找成功所需的平均查找次数:(1*3+2*3+3*1)/8=3/29【解答】(1)0123

21、45678910111213141516AprAugDecFebJanMarMayJuneJulySepOctNov平均查找长度为:31/12(2)012345678910111213141516平均查找长度为:3/2五、算法设计题1【分析】算法思想:先遍历右子树后遍历左子树。【解答】算法如下:Inorder(BiSTree bt, datatype X) if (bt) Inorder(bt-rchild,X);if(bt-data=X) printf(“%c”,bt-data); Inorder(bt-lchild,X); 2【分析】在合并过程中,并不释放或新建任何结点,而是采取修改指针的

22、方式来完成合并,这样,就必须按照后序序列把一棵树中元素逐个连接到另一棵树上,否则将会导致树的结构的混乱。【解答】算法如下:void BiTMerge(BiSTree *T, BiSTree *S) /*把二叉排序树合并到T中*/ if(S-lchild) BiTMerge (T,S-lchild); if(S-rchild) BiTMerge (T,S-rchild) /*合并子树*/ Insert_Node(T,S);void Insert (BiSTree *T,BiSTNode *S) /*把树结点S插入到T的合适位置*/ if(S-dataT-data) if (!T-rchild)

23、T-rchild=S; else Insert (T-rchild,S);else if(S-datadata) if (!T-lchild) T-lchild=S; else Insert (T-lchild,S);S-lchild=NULL; /*插入的新结点必须和原来的左右子树断绝关系*/S-rchild=NULL; /*否则会导致树结构的混乱*/ 3【分析】算法思想;以x为分界点遍历原二叉树并构造两棵新的二叉排序树。【解答】算法如下: void BiTSplit(BiSTree *T, BiSTree *A, BiSTree *B,int x) /*把二叉排序树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); /*分裂左右子树*/ if (T-data=x) Insert(A,T); else Insert(B,T); /*将元素结点插入到T的合适位置上*/

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

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