数据结构课后习题及解析第六章.docx
精品名师归纳总结资料word 精心总结归纳 - - - - - - - - - - - -第六章习题1试分别画出具有3 个结点的树和 3 个结点的二叉树的全部不同形状。2对题 1 所得各种形状的二叉树,分别写出前序、中序和后序遍历的序列。3已知一棵度为k 的树中有 n1 个度为 1 的结点, n2 个度为 2 的结点,nk 个度为 k 的结点,就该树中有多少个叶子结点并证明之。4. 假设一棵二叉树的先序序列为EBADCFHGIK,J中序序列为 ABCDEFGHIJ,K请画出该二叉树。 5已知二叉树有50 个叶子结点,就该二叉树的总结点数至少应有多少个? 6给出满意以下条件的全部二叉树:前序和后序相同中序和后序相同前序和后序相同7 n 个结点的 K 叉树,如用具有 k 个 child域的等长链结点储备树的一个结点,就空的Child域有多少个?8画出与以下已知序列对应的树:树的先根次序拜访序列为GFKDAIEBCH。J树的后根次序拜访序列为DIAEKFCJHB。G9假设用于通讯的电文仅由8 个字母组成,字母在电文中显现的频率分别为:0.07 , 0.19 , 0.02 , 0.06 ,0.32 ,0.03 ,0.21 , 0.10请为这 8 个字母设计哈夫曼编码。10已知二叉树采纳二叉链表存放, 要求返回二叉树T 的后序序列中的第一个结点指针, 是否可不用递归且不用栈来完成 .请简述缘由 .11.画出和以下树对应的二叉树:可编辑资料 - - - 欢迎下载精品名师归纳总结学习资料 名师精选 - - - - - - - - - -第 1 页,共 18 页 - - - - - - - - - -可编辑资料 - - - 欢迎下载精品名师归纳总结12已知二叉树根据二叉链表方式储备,编写算法,运算二叉树中叶子结点的数目。13编写递归算法:对于二叉树中每一个元素值为x 的结点,删去以它为根的子树,并释放相应的空间。14分别写函数完成:在先序线索二叉树T 中,查找给定结点 *p 在先序序列中的后继。在后序线索二叉树 T 中,查找给定结点 *p 在后序序列中的前驱。15分别写出算法,实现在中序线索二叉树中查找给定结点*p 在中序序列中的前驱与后继。16编写算法,对一棵以孩子- 兄弟链表表示的树统计其叶子的个数。17对以孩子 - 兄弟链表表示的树编写运算树的深度的算法。18已知二叉树根据二叉链表方式储备,利用栈的基本操作写出后序遍历非递归的算法。19设二叉树按二叉链表存放, 写算法判别一棵二叉树是否是一棵正就二叉树。正就二叉树是指:在二叉树中不存在子树个数为1 的结点。20运算二叉树最大宽度的算法。二叉树的最大宽度是指:二叉树全部层中结点个数的最大值。21已知二叉树根据二叉链表方式储备,利用栈的基本操作写出先序遍历非递归形式的算法。22. 证明:给定一棵二叉树的前序序列与中序序列,可唯独确定这棵二叉树。 给定一棵二叉树的后序序列与中序序列,可唯独确定这棵二叉树。23. 二叉树根据二叉链表方式储备,编写算法,运算二叉树中叶子结点的数目。24. 二叉树根据二叉链表方式储备,编写算法,将二叉树左右子树进行交换。实习题1. 问题描述 建立一棵用二叉链表方式储备的二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果。 基本要求 从键盘接受输入先序序列,以二叉链表作为储备结构,建立二叉树(以先序来建立)并对其进行遍历(先序、中序、后序),然后将遍历结果打印输出。要求采纳递归和非递归两种方法实现。 测试数据 ABC DE G F (其中 表示空格字符)输出结果为:先序: ABCDEGF中序: CBEGDFA后序: CGBFDBA2已知二叉树根据二叉链表方式储备,编写算法, 要求实现二叉树的竖向显示(竖向显示就是二叉树的按层显示)。可编辑资料 - - - 欢迎下载精品名师归纳总结资料word 精心总结归纳 - - - - - - - - - - - -3如题 1 要求建立好二叉树,按凹入表形式打印二叉树结构,如下图所示。2. 按凹入表形式打印树形结构,如下图所示。第六章答案6 1 分别画出具有 3 个结点的树和 3 个结点的二叉树的全部不同形状。【解答】具有 3 个结点的树具有 3 个结点的二叉树6.3 已知一棵度为 k 的树中有 n1 个度为 1 的结点,n2 个度为 2 的结点,nk 个度为 k 的结点,就该树中有多少个叶子结点?【解答】设树中结点总数为n, 就 n=n 0 + n1 + nk可编辑资料 - - - 欢迎下载精品名师归纳总结学习资料 名师精选 - - - - - - - - - -第 3 页,共 18 页 - - - - - - - - - -可编辑资料 - - - 欢迎下载精品名师归纳总结树中分支数目为 B, 就 B=n 1 + 2n 2 + 3n 3 + knk由于除根结点外,每个结点均对应一个进入它的分支,所以有n= B + 1即 n0 + n 1 + nk = n1 + 2n 2 + 3n 3 + knk + 1由上式可得叶子结点数为:n0 = n2 + 2n 3 + k-1n k + 16.5 已知二叉树有 50 个叶子结点,就该二叉树的总结点数至少应有多少个?【解答】 n0 表示叶子结点数, n2 表示度为 2 的结点数,就 n0 = n 2+1所以 n2= n0 1=49 ,当二叉树中没有度为1 的结点时,总结点数n=n 0 +n2 =996.6 试分别找出满意以下条件的全部二叉树:1前序序列与中序序列相同;2中序序列与后序序列相同;(3) 前序序列与后序序列相同。【解答】(1) 前序与中序相同:空树或缺左子树的单支树。(2) 中序与后序相同:空树或缺右子树的单支树。(3) 前序与后序相同:空树或只有根结点的二叉树。6.9假设通讯的电文仅由8 个字母组成,字母在电文中显现的频率分别为:0.07 ,0.19 ,0.02 ,0.06 , 0.32 , 0.03 ,0.21 ,0.10请为这 8 个字母设计哈夫曼编码。【解答】构造哈夫曼树如下:可编辑资料 - - - 欢迎下载精品名师归纳总结资料word 精心总结归纳 - - - - - - - - - - - -哈夫曼编码为:I 1:11111I 5: 1100I 2: 11110I 6: 10I 3:1110I 7 : 01I 4:1101I 8 : 006.11 画出如下图所示树对应的二叉树。【解答】可编辑资料 - - - 欢迎下载精品名师归纳总结学习资料 名师精选 - - - - - - - - - -第 5 页,共 18 页 - - - - - - - - - -可编辑资料 - - - 欢迎下载精品名师归纳总结资料word 精心总结归纳 - - - - - - - - - - - -6.15 分别写出算法,实现在中序线索二叉树T 中查找给定结点 *p 在中序序列中的前驱与后继。 在先序线索二叉树T 中,查找给定结点 *p 在先序序列中的后继。 在后序线索二叉树T 中,查找给定结点 *p 在后序序列中的前驱。( 1)找结点的中序前驱结点BiTNode*InPre BiTNode*p/*在中序线索二叉树中查找p 的中序前驱结点,并用pre 指针返回结果 */ if p->Ltag= =1pre = p->LChild;/* 直接利用线索 */ else/*在 p 的左子树中查找“最右下端”结点*/ for q=p->LChild; q->Rtag= =0; q=q->RChild; pre = q;return pre;可编辑资料 - - - 欢迎下载精品名师归纳总结学习资料 名师精选 - - - - - - - - - -第 6 页,共 18 页 - - - - - - - - - -可编辑资料 - - - 欢迎下载精品名师归纳总结( 2)找结点的中序后继结点BiTNode*InSucc BiTNode*p/*在中序线索二叉树中查找p 的中序后继结点,并用succ 指针返回结果 */ if p->Rtag= =1succ = p->RChild;/*直接利用线索 */ else/*在 p 的右子树中查找“最左下端”结点*/ for q=p->RChild; q->Ltag= =0; q=q->LChild; succ= q;return succ;(3) 找结点的先序后继结点BiTNode*PreSucc BiTNode*p/*在先序线索二叉树中查找p 的先序后继结点,并用succ 指针返回结果 */ if p->Ltag= =0succ = p->LChild; elsesucc= p->RChild;return succ;(4) 找结点的后序前驱结点BiTNode*SuccPre BiTNode*p/*在后序线索二叉树中查找p 的后序前驱结点,并用pre 指针返回结果 */ if p->Ltag= =1pre = p->LChild; elsepre= p->RChild;return pre;6.21 已知二叉树根据二叉链表方式储备,利用栈的基本操作写出先序遍历非递归形式的算法。【解答】可编辑资料 - - - 欢迎下载精品名师归纳总结VoidPreOrderBiTreeroot/*先序遍历二叉树的非递归算法*/InitStack&S; p=root;whilep.=NULL | .IsEmptyS ifp.=NULLVisitp->data; push&S,p; p=p->Lchild;elsePop&S,&p; p=p->RChild;6.24 已知二叉树根据二叉链表方式储备,编写算法,将二叉树左右子树进行交换。【解答】 算法一Voidexchange BiTreeroot p=root;if p->LChild .= NULL | p->RChild .= NULL temp = p->LChild;可编辑资料 - - - 欢迎下载精品名师归纳总结p->LChild = p->RChild; p->RChild = temp;exchange p->LChild ; exchange p->RChild ;算法二Voidexchange BiTreeroot p=root;if p->LChild .= NULL | p->RChild .= NULL exchange p->LChild ; exchange p->RChild ;temp = p->LChild;p->LChild = p->RChild; p->RChild = temp;第六章习题解析1试分别画出具有3 个结点的树和3 个结点的二叉树的全部不同形状。2对题 1 所得各种形状的二叉树,分别写出前序、中序和后序遍历的序列。可编辑资料 - - - 欢迎下载精品名师归纳总结3已知一棵度为k 的树中有 n 1 个度为 1 的结点,n 2 个度为 2 的结点,n k 个度为 k 的结点,就该树中有多少个叶子结点? 提示 :参考P.116性质 3n=n 0 + n 1 + n kB=n 1 + 2n 2 + 3n 3 + kn kn= B + 1n 0 + n 1 + n k = n 1 + 2n 2 + 3n 3 + kn k + 1n 0 = n 2 + 2n 3 + k-1n k + 14. 假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请画出该二叉树。 提示 :参考P.1486已知二叉树有50 个叶子结点,就该二叉树的总结点数至少应有多少个? 提示 : 方法 1( 1)一个叶子结点,总结点数至多 有多少个?结论:可压缩一度 结点。( 2)满二叉树或完全二叉树具有最少的一度 结点( 3)可能的最大满二叉树是几层?有多少叶结点?如何增补?可编辑资料 - - - 欢迎下载精品名师归纳总结25<50<2 6可能的最大满二叉树是6 层有 25 = 32个叶结点假设将其中x 个变为 2 度结点后,总叶结点数目为50就: 2x + 32x = 50得: x = 18此时总结点数目= 2 6 1 + 18 × 2 方法 2假设完全二叉树的最大非叶结点编号为m ,就最大叶结点编号为2m+1,2m+1-m=50 m=49总结点数目 =2m+1=99 方法 3由性质 3: n 0 =n 2 +1即: 50=n 2 +1所以: n 2=49令 n 1 =0 得: n= n 0 + n 2=99可编辑资料 - - - 欢迎下载精品名师归纳总结7给出满意以下条件的全部二叉树:a) 前序和中序相同b) 中序和后序相同c) 前序和后序相同 提示 :去异存同。a) D L R与 L D R的相同点: D R ,假如无L ,就完全相同,假如无LR ,。b) L DR与 LR D的相同点: L D ,假如无R,就完全相同。c) D LR与 LR D的相同点: D ,假如无L R ,就完全相同。(假如去D ,就为空树)7 n 个结点的K 叉树,如用具有k 个 child域的等长链结点储备树的一个结点,就空的Child域有多少个? 提示 :参考P.119 8画出与以下已知序列对应的树:树的先根次序拜访序列为GFKDAIEBCHJ。树的后根次序拜访序列为DIAEKFCJHBG。 提示 :( 1)先画出对应的二叉树可编辑资料 - - - 欢迎下载精品名师归纳总结资料word 精心总结归纳 - - - - - - - - - - - -( 2)树的后根序列与对应二叉树的中序序列相同9假设用于通讯的电文仅由8 个字母组成,字母在电文中显现的频率分别为:0.07 , 0.19 , 0.02 , 0.06 , 0.32 , 0.03 , 0.21 , 0.10( 1)请为这8 个字母设计哈夫曼编码,( 2)求平均编码长度。10 已知二叉树采纳二叉链表存放,要求返回二叉树T 的后序序列中的第一个结点的指针,是否可不用递归且不用栈来完成. 请简述缘由 . 提示 : 无右子的“左下端”11.画出和以下树对应的二叉树:12 已知二叉树根据二叉链表方式储备,编写算法,运算二叉树中叶子结点的数目。13 编写递归算法:对于二叉树中每一个元素值为x 的结点,删去以它为根的子树,并释放相应的空间。可编辑资料 - - - 欢迎下载精品名师归纳总结 提示 :学习资料 名师精选 - - - - - - - - - -第 13 页,共 18 页 - - - - - - - - - -可编辑资料 - - - 欢迎下载精品名师归纳总结 方法 1 :( 1)按先序查找。(2)超前查看子结点(3 )按后序释放。void DelSubTreeBiTree*bt,DataType xif *bt .= NULL && *bt ->data=x FreeTree*bt;*bt =NULL;elseDelTree *bt,xvoidDelTreeBiTree bt,DataType x if bt if bt->LChild && bt->LChild->data=x FreeTreebt->LChild; bt->LChild=NULL;if bt->RChild && bt->RChild->data=x FreeTreebt->RChild;可编辑资料 - - - 欢迎下载精品名师归纳总结bt->RChild=NULL;DelTreebt->LChild,x; DelTreebt->RChild,x; 方法 2 :( 1)先序查找。(2 )直接查看 当前根 结点( 3)用 指针参数 。 方法 3 : ( 1)先序查找。(2)直接查看 当前根 结点( 3 )通过 函数 值,返回 删除后结果 。(参示例程序)14 分别写函数完成:在先序线索二叉树T 中,查找给定结点*p在先序序列中的后继。在后序线索二叉树T 中,查找给定结点*p在后序序列中的前驱。 提示 :( 1)先查看线索,无线索时用下面规律:( 2)结点 *p在先序序列中的后继为其左子或右子。( 3)结点 *p在后序序列中的前驱也是其左子或右子。可编辑资料 - - - 欢迎下载精品名师归纳总结15 分别写出算法,实现在中序线索二叉树中查找给定结点*p在中序序列中的前驱与后继。(参例题)16 编写算法,对一棵以孩子-兄弟链表表示的树统计其叶子的个数。 提示 :( 1)可将 孩子 -兄弟链表 划分为 根、首子树 、兄弟树 ,递归处理。( 2)可利用 返回值 ,或 全局变量 。17 对以孩子 -兄弟链表表示的树编写运算树的深度的算法。18 已知二叉树根据二叉链表方式储备,利用栈的基本操作写出后序遍历非递归的算法。(参课本)19 设二叉树按二叉链表存放,写算法判别一棵二叉树是否是一棵正就二叉树。正就二叉树是指:在二叉树中不存在子树个数为1 的结点。 提示 :可利用任何递归、非递归遍历算法。20 运算二叉树最大宽度的算法。二叉树的最大宽度是指:二叉树全部层中结点个数的最大值。可编辑资料 - - - 欢迎下载精品名师归纳总结21 已知二叉树根据二叉链表方式储备,利用栈的基本操作写出先序遍历非递归形式的算法。22. 证明:给定一棵二叉树的前序序列与中序序列,可唯独确定这棵二叉树。给定一棵二叉树的后序序列与中序序列,可唯独确定这棵二叉树。23. 二叉树根据二叉链表方式储备,编写算法将二叉树左右子树进行交换。实习题1. 问题描述 建立一棵用二叉链表方式储备的二叉树,并对其进行遍历(先序、中序和后序) ,打印输出遍历结果。 基本要求 从键盘接受输入先序序列,以二叉链表作为储备结构,建立二叉树(以先序来建立)并对其进行遍历(先序、中序、后序),然后将遍历结果打印输出。要求采纳递归和非递归两种方法实现。 测试数据 ABC DE G F (其中 表示空格字符)输出结果为:先序: ABCDEGF中序: CBEGDFA后 序 : CGBFDBA 2已知二叉树根据二叉链表方式储备,编写算法,要求实现二叉树的竖可编辑资料 - - - 欢迎下载精品名师归纳总结资料word 精心总结归纳 - - - - - - - - - - - -向显示(竖向显示就是二叉树的按层显示)。 提示 :( 1)参习题6.20 ,实现逐层遍历( 2)队中储存每个结点的打印位置,其左、右子的距离3如题 1 要求建立好二叉树,按凹入表形式打印二叉树结构,如图 6.34所示。图 6.344按凹入表形式打印树形结构,如图6.35所示。 提示 :参 P.129例,用先根遍历。可编辑资料 - - - 欢迎下载精品名师归纳总结学习资料 名师精选 - - - - - - - - - -第 18 页,共 18 页 - - - - - - - - - -可编辑资料 - - - 欢迎下载