数据结构 第四章树习题课
数据结构与算法(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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 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;