数据结构 第四章树习题课
数据结构与算法(C语言篇)第4章 习题答案[2页]
![数据结构与算法(C语言篇)第4章 习题答案[2页]](https://img.taocdn.com/s3/m/33724e1ceffdc8d376eeaeaad1f34693daef10d1.png)
习题答案1.填空题(1)非线性、一对多(2)前驱(3)叶结点(叶子结点)(4)度数(5)两(6)满二叉(7)从根结点到该结点之间的路径长度与该结点的权值的乘积(8)树中所有叶结点的带权路径长度之和(9)递增(10)平衡因子(11)B树的阶2.选择题(1)B (2)D (3)A (4)C (5)B (6)A (7)D (8)D3.思考题(1)如果i=1,则结点i无双亲,为根结点。
如果i>1,则结点i的双亲结点是结点i/2。
如果2i≤n,则结点i的左孩子是结点2i,否则结点i为叶结点。
如果2i+1≤n,则结点i的右孩子是结点2i+1,否则结点i无右孩子。
(2)非叶结点最多只有M个孩子,且M>2。
除根结点以外的非叶结点都有k个孩子和k-1个数据元素,k值满足[M/2]≤k≤M。
每一个叶结点都有k-1个数据元素,k值满足[M/2]≤k≤M。
所有叶结点都在同一层次。
所有分支结点的信息数据一致(n,A0,K1,A1,K2,A2……K n,A n),其中:K i(i=1,2……n)为关键字,且K i<K i+1(i=1,2……n-1);A i为指向孩子结点的指针,且指针A i−1指向子树中的所有结点均小于K i,A n所指子树中的所有结点的关键字均大于K n;n为关键字的个数([M/2]-1≤n≤M-1)。
(3)B+树是B树的升级版,区别在于叶结点在B+树的最底层(所有叶结点都在同一层),叶结点中存放索引值、指向记录的指针、指向下一个叶结点的指针。
叶结点按照关键字的大小,从小到大顺序链接。
分支结点不保存数据,只用来作索引,所有数据都保存在叶结点。
B*树是B+树的变体,B*树不同于B+树的是:其非根和非叶子结点上增加了指向兄弟结点的指针。
4.编程题(1)1//参数1为树的结点个数,参数2起始结点编号2btree_t *btree_create(int n, int i){3 btree_t *t;4 //使用malloc函数为结点申请内存空间5 t = (btree_t *)malloc(sizeof(btree_t));6 //将结点编号作为数据,保存至data中7 t->data = i;89 if(2 * i <= n){ //满足条件,说明结点有左孩子,编号为2i10 //递归调用,为左孩子的创建申请空间11 t->lchild = btree_create(n, 2 * i);12 }13 else{ //不满足条件,则没有左孩子14 t->lchild = NULL;15 }1617 if(2 * i + 1 <= n){ //满足条件,说明结点有右孩子,编号为2i+118 //递归调用,为右孩子的创建申请空间19 t->rchild = btree_create(n, 2 * i + 1);20 }21 else{ //不满足条件,则没有右孩子22 t->rchild = NULL;23 }2425 return t;26}。
数据结构与算法 习题解答 第4章

第 4 章 树结构1.选择题(1)C (2)C (3)B (4)B (5)B (6)C (7)C (8)D (9)A (10)D (11)D (12)B (13)B (14)D (15)B2.判断题(1)√(2)√ (3)Ⅹ (4)Ⅹ(5)√ (6)Ⅹ(7)√ (8)√(9)√(10)Ⅹ (11)Ⅹ(12)Ⅹ(13)√(14)Ⅹ(15)Ⅹ(16)Ⅹ(17)√(18)Ⅹ(19)Ⅹ(20)√3.简答题(1)一棵度为 2 的树与一棵二叉树有何区别?树与二叉树之间有何区别?【解答】①二叉树是有序树,度为 2 的树是无序树,二叉树的度不一定是 2。
②二叉树是有序树,每个结点最多有两棵子树,树是无序树,且每个结点可以有多棵子树。
A(2)对于图 4-37 所示二叉树,试给出: 1)它的顺序存储结构示意图;BC2)它的二叉链表存储结构示意图; 3)它的三叉链表存储结构示意图。
DEF【解答】 1)顺序存储结构示意图:AB CDEF ^ ^ ^ G^ ^ HGH(图 4-37)2)二叉链表存储结构示意图:3)三叉链表存储结构示意图:ABC^^D^E^ ^ F^G^^H^A^BC^^ D^E^^F^ G^^ H^(3)对于图 4-38 所示的树,试给出: 1)双亲数组表示法示意图; 2)孩子链表表示法示意图; 3)孩子兄弟链表表示法示意图。
ABCGFEDIHJKMN(图 4-38)【解答】 1)双亲数组表示法示意图:2)孩子链表表示法示意图:0 A -1 1 B0 2 C0 3 D2 4 E2 5F1 6 G1 7 H5 8I 2 9J 4 10 K 4 11 M 3 12 N 83)孩子兄弟链表表示法示意图:0A 1B 2C 3D 4E 5F 6G 7H 8I 9J 10 K 11 M 12 N12^56^348^11 ^ 910 ^7^12 ^ABC^^GFEDI^^ H^^J^ K^ ^ M^ ^ N^(4)画出图 4-39 所示的森林经转换后所对应的二叉树,并指出森林中满足什么条件的 结点在二叉树中是叶子。
数据结构课后练习题(树)

数据结构习题书面作业练习题习 题 六 树 和 二 叉 树6.1 单项选择题1. 下图所示的4棵二叉树,____不是完全二叉树。
2. 下列编码中属前缀码的是( ) (A ){1,01,000,001} (B ){1,01,011,010}(C ){0,10,110,11} (D ){0,1,00,113. 已知某二叉树的后序遍历序列是dabec ,中序遍历序列是debac ,它的前序遍历序列是____。
A. acbedB. decabC. deabcD. cedba4.设a,b 为一棵二叉树上的两个结点,在中序遍历时,a 在b 前的条件是 。
A .a 在b 的右方B .a 在b 的左方C .a 是b 的祖先D .a 是b 的子孙5. 假定在一棵二叉树中,双分支结点数为15,单分支结点数为30个,则叶子结点数为 个。
A .15B .16C .17D .476. 按照二叉树的定义,具有3个结点的二叉树有____种。
A. 3B. 4C. 5D. 6(A)(B)(C)(D)图8.7 4棵二叉树7. 树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为先序遍历、中序遍历和后序遍历。
这里,我们把由树转化得到的二叉树叫做这棵数对应的二叉树。
结论____是正确的。
A. 树的先根遍历序列与其对应的二叉树的先序遍历序列相同B. 树的后根遍历序列与其对应的二叉树的后序遍历序列相同C. 树的先根遍历序列与其对应的二叉树的中序遍历序列相同D. 以上都不对8. 深度为5的二叉树至多有____个结点。
A. 16B. 32C. 31D. 109. 树最适合用来表示____。
A. 有序数据元素B. 无序数据元素C. 元素之间具有分支层次关系的数据D. 元素之间无联系的数据10. 设有13个值,用它们组成一棵赫夫曼树,则该赫夫曼树共有( )个结点。
A .13 B. 12 C. 26 D. 256.2 应用题1. 有一棵树如图8.12所示,回答下面的问题:⑴ 这棵树的根结点是____;⑵ 这棵树的叶子结点是____;⑶ 结点k3的度是____; ⑷ 这棵树的度是____;⑸ 这棵树的深度是____;⑹ 结点k3的子女是____; ⑺ 结点k3的父结点是____;2. 深度为k 的完全二叉树至少有____个结点。
南邮_数据结构课后习题答案讲解

?
?
?1 4 7 ?
?
?
?4 4 9 ?
?4 4 9 ?
4.7 求对题图4-1的稀疏矩阵执行矩阵转置时数组
num[]和k[]的值。
col
0
1
2
3
4
num[col] 1
0
2
1
2
k[col]
0
1
1
3
4
2020/2/8
14
第六章 习题讲解
6-2. 对于三个结点 A,B和C,可分别组成多少不同 的无序树、有序树和二叉树?
int i,j,sum=0;
for (i=0;temp[i]<x&&i<n;i++); //找到首个大于等于 x的元素位置 i
if(i>n-1) return; //没有符合条件的元素
ffoorr ((jj==ii;;ljs<tn[j;]<) =y&&j<n;j++); if (lst[j]>y//)找到首个//大大于于yy的的元元素素前位移置 j
?0 0 ???3 0
6 0
0 0
0? 7??
行三元组:???10
2 0
6 ?列三元组:?1
? 3??
??0
0 2
?3?
6
? ?
? 0 0 0 0 0?
?1 4 7 ?
?3 2 ?8?
? ?
0
0 ? 8 10 0??
??3 2 ?8??
??3
3
10
? ?
?? 0 0 0 0 9??
?3 3 10 ?
(2)void Search_Delete(List *lst, T x,T y)
数据结构课后习题答案第四章

第四章一、简述下列每对术语的区别:空串和空白串;串常量和串变量;主串和子串;静态分配的顺序串和动态分配的顺序串;目标串和模式串;有效位移和无效位移。
答:●空串是指不包含任何字符的串,它的长度为零。
空白串是指包含一个或多个空格的串,空格也是字符。
●串常量是指在程序中只可引用但不可改变其值的串。
串变量是可以在运行中改变其值的。
●主串和子串是相对的,一个串中任意个连续字符组成的串就是这个串的子串,而包含子串的串就称为主串。
●静态分配的顺序串是指串的存储空间是确定的,即串值空间的大小是静态的,在编译时刻就被确定。
动态分配的顺序串是在编译时不分配串值空间,在运行过程中用malloc和free等函数根据需要动态地分配和释放字符数组的空间(这个空间长度由分配时确定,也是顺序存储空间)。
●目标串和模式串:在串匹配运算过程中,将主串称为目标串,而将需要匹配的子串称为模式串,两者是相对的。
●有效位移和无效位移:在串定位运算中,模式串从目标的首位开始向右位移,每一次合法位移后如果模式串与目标中相应的字符相同,则这次位移就是有效位移(也就是从此位置开始的匹配成功),反之,若有不相同的字符存在,则此次位移就是无效位移(也就是从此位置开始的匹配失败)。
二、假设有如下的串说明:char s1[30]="Stocktom,CA", s2[30]="March 5 1999", s3[30], *p;(1)在执行如下的每个语句后p的值是什么?p=stchr(s1,'t'); p=strchr(s2,'9'); p=strchr(s2,'6');(2)在执行下列语句后,s3的值是什么?strcpy(s3,s1); strcat(s3,","); strcat(s3,s2);(3)调用函数strcmp(s1,s2)的返回值是什么?(4)调用函数strcmp(&s1[5],"ton")的返回值是什么?(5)调用函数stlen(strcat(s1,s2))的返回值是什么?解:(1) stchr(*s,c)函数的功能是查找字符c在串s中的位置,若找到,则返回该位置,否则返回NULL。
数据结构课后习题及解析第四章

11. 写算法,实现顺序串的基本操作 StrReplace(&s,t,v)r1 中第 index 个字符起求出首次与串 r2 相同的子串的起始位置。
写一个函数将顺序串 s1 中的第 i 个字符到第 j 个字符之间的字符用 s2 串替换。
写算法,实现顺序串的基本操作 StrCompare(s,t) 。
第四章习题1. 设 s=' I AM A STUDENT , t= ' GOO D,q=' WORKER 给出下列操作的结果: StrLength(s); SubString(sub1,s,1,7);SubString(sub2,s,7,1);StrIndex(s, ' A ' ,4); StrReplace(s, ' STUDEN 'T,q); StrCat(StrCat(sub1,t), StrCat(sub2,q));2. 编写算法,实现串的基本操作 StrReplace(S,T,V) 。
3. 假设以块链结构表示串,块的大小为 1,且附设头结点。
试编写算法,实现串的下列基本操作:StrAsign(S,chars) ; StrCopy(S,T) ; StrCompare(S,T) ; StrLength(S) ; StrCat(S,T) ; SubString(Sub,S,pos,len) 。
4. 叙述以下每对术语的区别:空串和空格串;串变量和串常量;主串和子串;串变量的名字和串变 量的值。
5. 已知:S=”(xyz)* ” ,T= ”(x+z)*y ”。
试利用联接、求子串和置换等操作,将 S 转换为T. 6. S 和T 是用结点大小为1的单链表存储的两个串,设计一个算法将串 S 中首次与T 匹配的子串逆 置。
7. S 是用结点大小为4的单链表存储的串,分别编写算法在第k 个字符后插入串T ,及从第k 个字符 删除 len 个字符。
数据结构第四章树和二叉树习题

04树和二叉树【单选题】1. 下列选项中不属于树形结构逻辑特征的是(C)。
A、有的结点有多个直接后继B、有的结点没有直接后继C、有的结点有多个直接前驱D、有的结点没有直接前驱2. 下列叙述中错误的是(B)。
A、树的度与该树中结点的度的最大值相等B、二叉树就是度为2的有序树C、有5个叶子结点的二叉树中必有4个度为2的结点D、满二叉树一定是完全二叉树3. 一棵二叉树中第6层上最多有(C)个结点。
A、2B、31C、32D、644. 一棵高为k的二叉树最少有(B)个结点。
A、k-1B、kC、k+1D、2k-1E、2k-15. 一棵高为k的二叉树最多有(C)个结点。
A、k+1B、2k-1C、2k-1D、2kE、2k+16. 一棵高为k的完全二叉树最少有(B)个结点。
A、2k-1-1B、2k-1C、2k-1D、2k7. 一棵高为k的完全二叉树最多有(C)个结点。
A、2k-1-1B、2k-1C、2k-1D、2k8. 一棵度为3的树中,度为3的结点有2个,度为2的结点有2个,度为1的结点有2个,则度为0的结点有(D)个。
A、4B、5C、6D、79. 含1000个结点的完全二叉树的高度为(B)。
A、9B、10C、11D、1210. 设完全二叉树T中含有n个结点,对这些结点从0开始按层序进行编号,若编号为i的结点有左孩子,则左孩子的编号为(D)。
A、2(i-1)B、2i-1C、2iD、2i+1E、2(i+1)11. 已知一算术表达式的中缀形式为A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为(D)。
A、-A+B*C/DEB、-A+B*CD/EC、-+*ABC/DED、-+A*BC/DE13. 先序遍历与中序遍历所得遍历序列相同的二叉树为(D )。
A 、根结点无左孩子的二叉树B 、根结点无右孩子的二叉树C 、所有结点只有左子树的二叉树D 、所有结点只有右子树的二叉树14. 下列叙述中正确的是(D )。
A 、由先序遍历序列和后序遍历序列可以惟一确定一棵二叉树B 、由森林转化而得的二叉树,其根结点一定有右子树C 、完全二叉树一定是满二叉树D 、在结点数目相同的二叉树中,完全二叉树的路径长度最短15. 由树转换而得的二叉树,根结点(B )。
计算机存储和组织数据方式之《数据结构》关于“树”的习题(PPT内含答案)

• 12.已知二叉树的先序遍历和后序遍历不能唯一确定这棵 二叉树,这是因为不知道根结点是哪一个。
•
(T )
• 7.树结构中的每个结点最多只有一个直接前驱。 (T )
• 8.完全二叉树一定是满二叉树。 (F)
• 9.由树转换成二叉树,其根结点的右子树一定为空。 (T )
• 10.在先序遍历二叉树的序列中,任何结点的子树的所有 结点都是直接跟在该结点之后。( F )
• 11.一棵二叉树中序遍历序列的最后一个结点,发家是该 二叉树先序遍历的最后一个结点。 ( T )
B.CBDGFEA D.CBEGFDA
• 8.某二又树的后序遍历序列为DABEC,中序遍历序列为
DEBAC,则先序遍历序列为( D )。
• A.ACBED C.DEABC
B.DECAB D.CEDBA
• 9.在完全二叉树中,如果一个结点是叶子结点,则它没 有( C )。
• A.左孩子结点
B.右孩子结点
• 5.对于二叉树来说,第i层上最多有___2i-1______个结点。 • 6.由三个结点构成的二叉树,共有____5_____种不同的
结构。
• 7.由一棵二叉树的先序序列和___中序____序列可唯一 确定这棵二叉树。
习题6
• 9.先序序列和中序序列相同的二叉树为单右枝二叉树或 孤立结点。
• 10.设一棵二叉树共有50个叶子结点(终端结点),则有 ______49______度为2的结点。
• A. 5
B. 6
• C. 7
D. 8
• 6.二叉树的先序遍历序列为ABC的不同二叉树有( C ) 种形态。
• A. 3
B. 4
• C. 5
D.6
习题6
《数据结构》应用题参考习题

一.《树》应用题1. 已知一棵树边的集合为{<i,m>,<i,n>,<e,i>,<b,e>,<b,d>,<a,b>,<g,j>,<g,k>,<c,g>,<c,f>,<h,l>,<c,h>,<a,c>},请画出这棵树,并回答下列问题:(1)哪个是根结点?(2)哪些是叶子结点?(3)哪个是结点g的双亲?(4)哪些是结点g的祖先?(5)哪些是结点g的孩子?(6)哪些是结点e的孩子?(7)哪些是结点e的兄弟?哪些是结点f的兄弟?(8)结点b和n的层次号分别是什么?(9)树的深度是多少?(10)以结点c为根的子树深度是多少?2. 一棵度为2的树与一棵二叉树有何区别。
3. 试分别画出具有3个结点的树和二叉树的所有不同形态?4. 已知用一维数组存放的一棵完全二叉树:ABCDEFGHIJKL,写出该二叉树的先序、中序和后序遍历序列。
5. 一棵深度为H的满m叉树有如下性质:第H层上的结点都是叶子结点,其余各层上每个结点都有m棵非空子树,如果按层次自上至下,从左到右顺序从1开始对全部结点编号,回答下列问题:(1)各层的结点数目是多少?(2)编号为n的结点的父结点如果存在,编号是多少?(3)编号为n的结点的第i个孩子结点如果存在,编号是多少?(4)编号为n的结点有右兄弟的条件是什么?其右兄弟的编号是多少?6. 找出所有满足下列条件的二叉树:(1)它们在先序遍历和中序遍历时,得到的遍历序列相同;(2)它们在后序遍历和中序遍历时,得到的遍历序列相同;(3)它们在先序遍历和后序遍历时,得到的遍历序列相同;7. 假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请写出该二叉树的后序遍历序列。
8. 假设一棵二叉树的后序序列为DCEGBFHKJIA,中序序列为DCBGEAHFIJK,请写出该二叉树的后序遍历序列。
数据结构第四章的习题答案

数据结构第四章的习题答案数据结构第四章的习题答案在学习数据结构的过程中,习题是非常重要的一环。
通过解答习题,我们可以更好地理解和应用所学的知识。
在第四章中,我们学习了树和二叉树的相关概念和操作。
下面我将为大家提供一些第四章习题的答案,希望能帮助大家更好地掌握这一章节的内容。
1. 请给出树和二叉树的定义。
树是由n(n>=0)个结点构成的有限集合,其中有且仅有一个特定的结点称为根结点,其余的结点可以分为若干个互不相交的有限集合,每个集合本身又是一个树,称为根的子树。
二叉树是一种特殊的树结构,其中每个结点最多有两个子结点,分别称为左子结点和右子结点。
二叉树具有递归的定义,即每个结点的左子树和右子树都是二叉树。
2. 请给出树和二叉树的遍历方式。
树的遍历方式包括前序遍历、中序遍历和后序遍历。
前序遍历是先访问根结点,然后依次遍历左子树和右子树。
中序遍历是先遍历左子树,然后访问根结点,最后遍历右子树。
后序遍历是先遍历左子树和右子树,最后访问根结点。
二叉树的遍历方式包括前序遍历、中序遍历和后序遍历。
前序遍历是先访问根结点,然后依次遍历左子树和右子树。
中序遍历是先遍历左子树,然后访问根结点,最后遍历右子树。
后序遍历是先遍历左子树和右子树,最后访问根结点。
3. 给定一个二叉树的前序遍历序列和中序遍历序列,请构建该二叉树。
这个问题可以通过递归的方式解决。
首先,根据前序遍历序列的第一个结点确定根结点。
然后,在中序遍历序列中找到根结点的位置,该位置左边的结点为左子树的中序遍历序列,右边的结点为右子树的中序遍历序列。
接下来,分别对左子树和右子树进行递归构建。
4. 给定一个二叉树的中序遍历序列和后序遍历序列,请构建该二叉树。
和前面的问题类似,这个问题也可以通过递归的方式解决。
首先,根据后序遍历序列的最后一个结点确定根结点。
然后,在中序遍历序列中找到根结点的位置,该位置左边的结点为左子树的中序遍历序列,右边的结点为右子树的中序遍历序列。
数据结构与算法教程 习题答案 作者 朱明方 吴及 第4章习题解答.docx

第4章习题解答4. 1如图4-51所示的树中,找出树中度最大的结点, 说明度的值?找出树中度最小的结点,其度是多少?该树的度是多少?它的深度是多少?[解答]该树中,度最大的结点分别是包含元素A和C的结点,它们的度图 4-51都为3,它也就是该树的度。
树中的叶子结点是度最小的结点,它们分别是包含元素E, F, G, H, I, J的结点,它们的度都为0。
该树深度为3o4.2 一棵共有n个结点的树,其所有分支结点的度都为k,请求出该树的叶子结点数。
[解答]设树中的分支结点数为队,叶子结点数n°,则有:n=n k+n0 , ①设分支数为B,因为除了根结点以外每个结点都有一个分支指向,因此有:B=n-1, ②另一方面,所有分支都由分支结点发出,则有:B=n k*k , ③比较②、③式有:n k*k =n-l, 即:n k=-!!—!-, ④k将④代入①,可得:n°=n-。
k所以该树的叶子结点数为:n-。
k4.3已知一棵度为m的树中,有m个度为1的结点,有址个度为2的结点,…,有 &个度为m的结点,请计算该树中的叶子结点数。
[解答]设该树共有n个结点,叶子结点数为m,则有:n= no + ni + n2+ …+ n…①另一方面,树中除了根结点以外每个结点都有一个指针指向,也就是说总指针数与总结点数之间相差1;而树中的指针都是由非叶子结点发出的,由此可以得到:n= 1+ ni + 2*m + 3*m + ,,, +m*n“,②比较式①、②有:m = 1 + m + 2m +=1+ £(「1)勺i=24.4假设以孩子表示法用定长结点表示一棵有n个结点,度为k的树,请计算出树中的空指针数目。
[解答]因为树的度为k, n个定长结点共有nk个指针域;除根结点外,每个结点有…个指针指向,即,树中共有n-1个指针。
所以,空指针域个数为:nk-(n-l)=n(k-l)+l (个)。
4.5树与二叉树有何异同?度为2的有序树与二叉树有何区别?[解答]树与二又树都具有明显的层次结构,都是表示•对多的联系。
数据结构的第4-7习题的答案

4.10 线性表有两种存储结构,即顺序表和单链表。试问: (1)若有N个线性表同时并存,且在处理过程中各表长度会
动态发生变化,线性表的总数也会自动地改变,在此情况下 应选用哪种存储结构?为什么?
应采用链式存储结构,因为采用链式存储时插入删除操作不需 要移动数据元素
(2)若线性表的总数基本稳定,且很少进行插入和删除操作 ,但要以最快的速度存取表中元素,那么应采用哪种存储结 构?为什么?
pq
pq r
rq
head *
A
1
&C
3
$
D
E^
p=NULL r=NULL
Void invert(LinkList &head) { linklist p,q,r;
p=r=NULL; q=head; while(q!=NULL) {r=q->next; q->next=p; p=q; q=r; } head=p; }
3在长度为n的顺序表上进行 插入运算,有几个可插入的 位置?在第i(假设合法)个 位置上插入一个数据元素, 需要向什么方向平移多少个 数据元素?在长度为n的顺 序表上进行删除运算,有几 个可删除的数据元素?删除 第i(假设合法)个位置上的 数据元素,需要向什么方向 平移多少个数据元素?
1
2
第i个位置上插入,需向右移 动n-i+1个数据元素
Status EnQueue(stack &s1,ElemType x) { if(S1.top==n-1) return 0;
else {Push(s1,x); return 1;}} 时间复杂度T(n)=O(1)
Status DeQueue(stack &s1,Stack &s2,ElemType &x) { ElemType y; While(!StackEmpty(S1))
数据结构第4单元课后练习答案

对于三个结点A,B和C,可分别组成多少 不同的无序树、有序树和二叉树?
答:(1)无序树:9棵 (2)有序树:12棵 (3)二叉树:30棵
高度为h的k叉树的特点是:第h层的节点度为 0,其余结点的度均为k。如果按从上到下, 从左到右的次序从1开始编号,则: ①各层的结点是多少? ②编号为i的结点的双亲的编号是多少? ③编号为i的结点的第m个孩子的编号是多少? ④编号为i的结点的有右兄弟的条件是什么?
试证明在哈夫曼算法的实施过程中,二叉树森林中的每 一棵子树都是Huffman树。
证明: 在Huffman算法进行的每一步,都会有一棵新的二叉树产生,它是合并 原来森林中根结点权值最小的两棵子树而得来的。假设此二叉树为T。 取T的根为一棵独立的子树,则它是一棵Huffman树,将此结点向下分 解,仍然得到一棵Huffman树。 此后,按照与T的形成过程相反的顺序依次分解各叶结点。由于在每次 分解时,新产生的两个叶结点在Huffman算法过程中,都是待合并子树根 结点中权值最小的,也就必然在本二叉树中是权值最小的两个叶结点。 根据前面的定理可知,T是一棵Huffman树。
试证明哈夫曼算法的正确性。
定理 分裂一棵Huffman树的某个叶结点,如果产生的两个叶结点的权值 在所有叶结点权值中最小,则将生成一棵新的Huffman树。 证明: 假设二叉树T是字母表C上的一棵Huffman树,z是它的一个叶节点。在 z的下面添加两个子结点x和y,它们的权值分别是f(x)和f(y),且满足 f(z)=f(x)+f(y), f(x)和f(y)在字母表C' =C-{z}+{x,y}上的权值最小,可设新 产生的二叉树为T'。 在字母表C'上存在一棵最优二叉树T",在T"上x和y互为兄弟结点。在 T"中删除结点x和y,将字母z以及权值f(z)=f(x)+f(y)赋予x和y在T"中的父 结点,得到一棵在字母表C上的二叉树Ť。 根据引理三,可知Ť是字母表C上的最优二叉树,由于T也是字母表C上 的最优二叉树,所以WPL(Ť)= WPL(T)。 由于WPL(Ť)= WPL(T")-f(x)-f(y), WPL(T)= WPL(T')-f(x)-f(y),所以 WPL(T")=WPL(T'),即,T'是字母表C'上的最优二叉树。证毕。 补充说明:利用Huffman算法构造一棵二叉树T后,单独取出根结点和它 的两个子结点,则该子树必是一棵最优二叉树。以后,按照与T的形成过 程的相反的顺序依次分解各叶结点,直到再次构造出T,则依据上面的定 理可知T是一棵Huffman树。
《数据结构》第四章习题参考答案

《数据结构》第四章习题一、判断题(在正确说法的题后括号中打“√”,错误说法的题后括号中打“×”)1、KMP算法的特点是在模式匹配时指示主串的指针不会变小。
( √)2、串是一种数据对象和操作都特殊的线性表。
( √)3、只包含空白字符的串称为空串(空白串)。
( ×)4、稀疏矩阵压缩存储后,必会(不会)失去随机存取功能。
( ×)5、使用三元组表示稀疏矩阵的非零元素能节省存储空间。
( √)6、插入与删除操作是数据结构中最基本的两种操作,因此这两种操作在数组中也经常使用。
(×)7、若采用三元组表存储稀疏矩阵,只要把每个元素的行下标和列下标互换(错的),就完成了对该矩阵的转置运算。
(×)二、单项选择题1.下面关于串的的叙述中,哪一个是不正确的?( B )A.串是字符的有限序列B.空串是由空格构成的串(空串是长度为零的串)C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储2.有串S1=’ABCDEFG’,S2 = ’PQRST’,假设函数con(x,y)返回x和y串的连接串,subs(s,i,j)返回串s的从序号i的字符开始的j个字符组成的子串,len(s)返回中s的长度,则con(subs(s1,2,len(s2)),subs(s1,len(s2),2))的结果串是( D )。
A.BCDEF B.BCDEFG C.BCPQRST D.CDEFGFG3、串的长度是指( B )A.串中所含不同字母的个数B.串中所含字符的个数C.串中所含不同字符的个数D.串中所含非空格字符的个数三、填空题1、串是一种特殊的线性表,其特殊性表现在_数据元素为字符,操作集也不同__;串的两种最基本的存储方式是_顺序存储_、__ 链式存储_;两个串相等的充分必要条件是__两串的长度相等且两串中对应位置的字符也相等__。
2、设正文串长度为n,模式串长度为m,则串匹配的KMP算法的时间复杂度为_O(m+n)__。
数据结构课后习题及解析第四章

第四章习题1. 设s=’I AM A STUDENT’, t=’GOOD’, q=’WORKER’。
给出下列操作的结果:StrLength(s); SubString(sub1,s,1,7); SubString(sub2,s,7,1);StrIndex(s,’A’,4); StrReplace(s,’STUDENT’,q);StrCat(StrCat(sub1,t), StrCat(sub2,q));2. 编写算法,实现串的基本操作StrReplace(S,T,V)。
3. 假设以块链结构表示串,块的大小为1,且附设头结点。
试编写算法,实现串的下列基本操作:StrAsign(S,chars); StrCopy(S,T); StrCompare(S,T); StrLength(S);StrCat(S,T); SubString(Sub,S,pos,len)。
4.叙述以下每对术语的区别:空串和空格串;串变量和串常量;主串和子串;串变量的名字和串变量的值。
5.已知:S=”(xyz)*”,T=”(x+z)*y”。
试利用联接、求子串和置换等操作,将S转换为T.6.S和T是用结点大小为1的单链表存储的两个串,设计一个算法将串S中首次与T匹配的子串逆置。
7.S是用结点大小为4的单链表存储的串,分别编写算法在第k个字符后插入串T,及从第k个字符删除len个字符。
以下算法用定长顺序串:8.编写下列算法:(1)将顺序串r中所有值为ch1的字符换成ch2的字符。
(2)将顺序串r中所有字符按照相反的次序仍存放在r中。
(3)从顺序串r中删除其值等于ch的所有字符。
(4)从顺序串r1中第index 个字符起求出首次与串r2相同的子串的起始位置。
(5)从顺序串r中删除所有与串r1相同的子串。
9.写一个函数将顺序串s1中的第i个字符到第j个字符之间的字符用s2串替换。
10.写算法,实现顺序串的基本操作StrCompare(s,t)。
数据结构——树习题

数据结构——树练习注:“[]”为向上取整,“{}”为向下取整。
一、填空题1、二叉树第i(i>=1)层上至多有__2^(i-1)___个结点。
2、深度为k(k>=1)的二叉树至多有___2^k -1__个结点。
3、具有n个结点的完全二叉树的深度为__log2(n+1)____。
4、具有n个结点的二叉树中,一共有____2n___个指针域,其中只有____n-1___个用来指向结点的左右孩子,其余的___n+1_____个指针域为NULL。
5、若二叉树的一个叶子是某子树的中根遍历序列中的第一个结点,则它必是该子树的后根遍历序列中的___第一个_____个结点。
6、在____先序____遍历二叉树的序列中,任何结点的子树上的所有结点,都是直接跟在该结点之后。
7、具有n个结点的完全二叉树,若按层次从上到下、从左到右对其编,号(根结点为1号),则编号最大的分支结点序号是____n/2____,编号最小的分支结点序号是___1____,编号最大的叶子结点序号是_____n__,编号最小的叶子结点序号是__n/2 +1_____。
8、先根遍历树和先根遍历与该树对应的二叉树,其结果___相同____(填“相同”或“不同”)。
9、由____一颗树___转换成二叉树时,其根结点的右子树总是空的。
10、若一棵二叉树的叶子数为n,则该二叉树中,左、右子树皆非空的结点个数为___n-1____。
11、任意一棵具有n个结点的二叉树,若它有m个叶子,则该二叉树上度数为1的结点为___n-2m+1___个。
12、现有按中序遍历二叉树的结果为ABC,问有____5__种不同形态的二叉树可以得到这一遍历结果13、已知一棵度为3的树有2个度为1的结点,3个度过为2的结点,4个度为3的结点,则该树中有____12___个叶子结点。
二、单选题1、1.以下说法错误的是( 1. )①树形结构的特点是一个结点可以有多个直接前趋②线性结构中的一个结点至多只有一个直接后继③树形结构可以表达(组织)更复杂的数据④树(及一切树形结构)是一种"分支层次"结构⑤任何只含一个结点的集合是一棵树2.以下说法错误的是( 4 )①完全二叉树上结点之间的父子关系可由它们编号之间的关系来表达②在三叉链表上,二叉树的求双亲运算很容易实现③在二叉链表上,求根,求左、右孩子等很容易实现④在二叉链表上,求双亲运算的时间性能很好3、深度为6的二叉树最多有( 2 )个结点( )①64 ②63 ③32 ④314、将含有83个结点的完全二叉树从根结点开始编号,根为1号,后面按从上到下、从左到右的顺序对结点编号,那么编号为41的双结点编号为 ( 4 )①42 ②40 ③21 ④205、任何一棵二叉树的叶结点在其先根、中根、后跟遍历序列中的相对位置 ( 3 )①肯定发生变化②有时发生变化③肯定不发生变化④无法确定6、设深度为k的二叉树上只有度为0和度为2的节点,则这类二叉树上所含结点总数最少( 3)个①k+1 ②2k ③2k-1 ④2k+17、下列说法正确的是( 1 )①树的先根遍历序列与其对应的二叉树的先根遍历序列相同②树的先根遍历序列与其对应的二叉树的后根遍历序列相同③树的后根遍历序列与其对应的二叉树的先根遍历序列相同④树的后根遍历序列与其对应的二叉树的后根遍历序列相同8、设森林T中有4棵树,第一、二、三、四棵树的结点个数分别是n1,n2,n3,n4,那么当把森林T转换成一棵二叉树后,且根结点的右子树上有( 4)个结点。
数据结构课后题答案(第4章).

数据结构部分课后习题答案第四章4.1广度优先生成树(黑体加粗边:深度拓扑排序序列:v0-v2-v3-v1-v4 4.2广度深度(1(2加边顺序a-b b-e e-d d-f f-c4.3、如图所示为一个有6个顶点{u1,u2,u3,u4,u5,u6}的带权有向图的邻接矩阵。
根据此邻接矩阵画出相应的带权有向图,利用dijkstra 算法求第一个顶点u1到其余各顶点的最短路径,并给出计算过程。
带权有向图:4.4证明在图中边权为负时Dijkstra算法不能正确运行若允许边上带有负权值,有可能出现当与S(已求得最短路径的顶点集,归入S内的结点的最短路径不再变更内某点(记为a以负边相连的点(记为b确定其最短路径时,它的最短路径长度加上这条负边的权值结果小于a原先确定的最短路径长度,而此时a在Dijkstra算法下是无法更新的。
4.5P.198 图中的权值有负值不会影响prim和kruskal的正确性如图:KRUSKAL求解过程:4.6 Dijkstra算法如何应用到无向图?答:Dijkstra算法通常是运用在带非负权值的有向图中,但是无向图其实就是两点之间两条有向边权值相同的特殊的有向图,这样就能将Dijkstra算法运用到无向图中。
4.7用FLOYD算法求出任意两顶点的最短路径(如图A(6所示。
A(0= A(1= A(2=A(3= A(4=A(5= A(6= V1 到 V2、V3、V4、V5、V6 往返路径长度分别为 5,9,5,9,9,最长为 9,总的往返路程为 37 同理 V2 到 V1、V3、V4、V5、V6 分别为 5,8,4,4,13,最长为 13,总和 34 V3 对应分别为 9,8,12,8,9,最长为 12,总和为 46 V4 对应分别为 5,4,12,4,9,最长为 12,总和为 34 V5 对应分别为9,4,8,4,9,最长为 9,总和为 34 V6 对应分别为 9,13,9,9,9,最长为13,总和为 49 题目要求娱乐中心“距其它各结点的最长往返路程最短” ,结点V1, V5 最长往返路径最短都是 9。
数据结构第4单元课后练习

对于三个结点A,B和C,可分别组成多少 不同的无序树、有序树和二叉树?
高度为h的k叉树的特点是:第h层的节点度为 0,其余结点的度均为k。如果按从上到下, 从左到右的次序从1开始编号,则: ①各层的结点是多少? ②编号为i的结点的双亲的编号是多少? ③编号为i的结点的第m个孩子的编号是多少? ④编号为{A,B,C,D,E,F},W={2,3,5,7,9,12},对字符集合 进行哈夫曼编码,W为各字符的频率。 (1) 画出哈夫曼树 (2)计算带权路径长度 (3) 求各字符的编码
设计一个递归算法,实现对一个有序表的顺序搜索。
画出对长度为12的有序表进行对半查找的二叉判定树, 并求等概率搜索时,成功搜索的平均搜索长度。
设对一棵二叉树进行中序遍历和后序遍历的 结果分别为: (1)中序遍历 B D C E A F H G (2)后序遍历 D E C B H G F A 画出该二叉树。
写出下面得二叉树的遍历结果。
设计算法,交换一棵二叉树中每个结点 的左、右子树。
把下图中的树转换成对应的二叉树。
把下图中的二叉树转换成对应的树或森林。
试证明哈夫曼算法的正确性。
试证明在哈夫曼算法的实施过程中,二叉树森林中的每 一棵子树都是Huffman树。
最新数据结构习题课4说课讲解

A
D2 [创建辅助队列, 根结点入队]
B
CREATE(Q). Q ( t,0) . D3 [利用队列Q遍历第d层结点] WHILE NOT (IsEmpty(Q)) DO ( (p,d) Q .
EF C D G
WHILE p≠NULL DO
( IF FirstChild(p)≠NULL THEN Q(FirstChild(p),d+1)
当k1时对任意两个叶结点完全二叉树的叶子结点只能在层数最大两层出现并且连续出现在层次遍历二叉树时增加一个标志bb1表示所有已扫描过的结点均有左右孩子b0表示遇到无左或右孩子的结点此后的所有结点均应为叶结点
数据结构习题课4
第4章作业
4-2,4-3, 4-5,4-6,4-7,4-8, 4-10, 4-12,4-13
对新的森林重复上一步操作,直至森林中只有 唯一的根结点时,终止操作。
135
55
80
25
12
13
30 39
5
7
18
41 21
{ 5,13,21,7,18,30,41 }
4-13
编写算法计算二叉树中边的个数。
分析
边数=结点数-1;各种遍历计算结点数 直接计算边数。 时间复杂度都是O(n)
p←NextBrother(p) .) )
▌
分析
[解题思路2] 树的深度dept(t)=max(t的各子树的深度)+1
A BCD E FG
A B EF C D
G
算法 Depth(t. d) //[解题思路2] 树的深度dept(t)=max(t的各子树的深度)+1 D1[递归出口]
IF t=NULL THEN ( d← -1 . RETURN ) IF (GFC(t)=NULL) THEN ( d← 0 . RETURN ) D2[递归调用] p=GFC(t). Max ← -1. // Max存储各子树的最大深度 WHILE (p≠NULL)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2h-1
个。
(10)设森林F中有4棵树,第1,2,3,4棵树的结点个数分别 为n1,n2,n3,n4,当把该森林F转换成一棵二叉树后,其根结点的 左子树有 n1 个结点,右子树有 n2+n3+n4 个结点。
8
二、判断题
(11) 二叉树是树的特殊情形。 × (12) 若有一个结点是二叉树中某个子树的中序遍历结 果序列的最后一个结点,则它一定是该子树的前序遍 历结果序列的最后一个结点。 × (13) 若有一个叶结点是二叉树中某个子树的中序遍历 结果序列的最后一个结点,则它一定是该子树的前序 遍历结果序列的最后一个结点。× (14) 若有一个叶结点是二叉树中某个子树的前序遍历 结果序列的最后一个结点,则它一定是该子树的中序 遍历结果序列的最后一个结点。 ×
(7)对于一棵具有n个结点的二叉树的二叉链表中,指针总数为
为 2n ,其中 n-1 个指针指向子女结点, n+1 指针空闲。
7
(8)在Huffman树中,若编码长度只允许小于等于4,则除了已
对两个字符编码为0和10外,还可最大对
4 个字符编码。
(9)设高度为h(h≥1)的二叉树中,若设二叉树只有度为0和
if((t->leftChild&&!t->rightChild)|| (!t->leftChild&&t->rightChild))
return 1+Degrees1(t->leftChild)+Degrees1(t->rightChild); }
15
3. 统计二叉树中度为2的结点个数。
int Degrees2(BinTreeNode *t) { if (!t) return 0; if(t->leftChild && t->rightChild) return 1+Degrees2(t->leftChild)+Degrees2(t->rightChild);
9
二、对二叉树递归算法的理解
void Preorder(BinTree *r) { // 前序遍历的递归算法 void Preorder(BinTree *r) { // 消去前序遍历第二个递归调用 while(r) { cout<<r->data;
if(r) {
cout<<r->data; ② Preorder(r->leftChild); ① Preorder(r->rightChild); }
(3) 高度为h的k叉树最多有
个结点。
n个结点的k叉树的最小高度为
log
n ( k 1) 1 k
。
假定一棵三叉树的结点个数为50,则它的最小高度为 log 101 3 最大高度为 50 。 一棵高度为5的满二叉树中的结点数为 25-1 一棵高度为3的满四叉树中的结点数为 (43-1)/3 。 。
if (!t) return 0; if(t->leftChild||t->rightChild) {
p= t->leftChild;
t->leftChild= t->rightChild;
t->rightChild=p;
} }
3
4-14.将图4.25中的树转换成二叉树。然后对树和转 换成的二叉树分别进行适当的遍历,并加以对比。
A B F G H L 图4.25 树 C D I J M E K
4
一、填空题
(1)对于一棵具有n个结点的树,该树中所有结点度数之和为 n-1 。
a1 ( q h 1) 1 ( k h 1) k h 1 q 1 k 1 k 1
(2) k叉树上的i层最大有 ki-1 个结点。
if((t->leftChild&&!t->rightChild)|| (!t->leftChild&&t->rightChild))
return 1;
return Degrees1(t->leftChild)+Degrees1(t->rightChild); }或 int Degrees1(BinTreeNode *t) { if (!t) return 0;
第四章 树与二叉树
习题课
1
作业:p125 4-1 (省略) 4-3 有m个叶子的二叉树最少有多少个结点?
4-4 现有按后序遍历二叉树的结果为C,B,A,有
几种不同的二叉树可得到这一结果?
A
B C
2
4-10 设计一个算法,将一个用二叉链表存储的二 叉树的每个结点的左、右子女位置交换。
void Change (BinTreeNode *t) {
13
四、设二叉树以二叉链表表示,试编写有关二叉树的递归算法。 1. 统计二叉树中叶结点的个数。 int Degrees0(BinTreeNode *t) { if (!t) return 0; if(!t->leftChild && !t->rightChild) return 1; return Degrees0(t->leftChild)+Degrees0(t->rightChild); } 或 void Degrees0(BinTreeNode *t,&count) {
}
16
4. 统计二叉树的高度
int high(BinaryTreeNode *t) { if (!t) return 0;
lh=high(t->leftChild);
rh=high(t->rightChild);
return 1+(lh>rh?lh:rh);
} int Depth (BinaryTreeNode *t ) { if (!t ) return 0; else return 1+Max ( Depth ( t→leftChild ), Depth ( t→rightChild ) ); }
cout <<p->data; s.Push(p); p=p->leftChild; }
if(!s.IsEmpty()){ p=s.Pop();p=p->rightChild; }//if }//while }// lnOrderTraverse
11
1、3个结点的树和二叉树个共有多少不同形态?
树有2种,二叉树有5种。 2、如一棵树有n1个度为1的结点,有n2个度为2的 结点,……, nm个度为m的结点,试问有多少个度 为0的结点? 解:n=n0+n1+n2+…+nm n-1=n1+2*n2+…+mnm 化简:n=1+n2+2n3+…+(m-1)nm
5
一、填空题
(4)在一棵二叉树中,若度为2的结点数有5个,度为1 的结点数 有6个,那么度为0的结点数有
6
个?
(5)在一棵三叉树中,若度为3的结点数有2个,度为2的结点数 有1个,度为1 的结点数有2个,那么度为0的结点数有
6 个?
(4) n=n0+n1+n2=n0+5+6=e+1=2*5+1*6+1 => n0=6
A
Preorder(r->leftChild);
r=r->rightChild; } }
}
B D
C
E
10
非递归的前序遍历算法:
void PreOrderTraverse(BinaryTreeNode *r){
Stack s; s.InitStack();p=r;
while(p || !s.IsEmpty()){ while(p) {
=1+ (i 1) ni
i2
12
m
3、试分别找出满足下列条件的所有二叉树: (1)二叉树的前序遍历与中序遍历相同; (2)二叉树的中序遍历与后序遍历相同; (3)二叉树的前序遍历与后序遍历相同;
(1) 空二叉树或左子树为空的二叉树。
(2) 空二叉树或右子树为空的二叉树。
(3) 空二叉树或只有根结点的二叉树。
(5) n=n0+n1+n2+n3=n0+2+1+2=e+1=3*2+2*1+1*2+1
=> n0=6
6
(6)若对一棵二叉树从0开始进行结点编号, 并按此编号把它顺序
存储到一维数组a中,则a[i]元素的左子女结点编号为 2i+1 ,
右子女结点编号为
2i+2
,双亲结点编号为
i 1 2 。
17
if (t) {
if(!t->leftChild && !t->rightChild) count++; Degrees0(t->leftChild, count);
Degrees0(t->rightChild, count); }
}
14
四、设二叉树以二叉链表表示,试编写有关二叉树的递归算法。 2. 统计二叉树中度为1的结点个数。 int Degrees1(BinTreeNode *t) { if (!t) return 0;