




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章 树和二叉树7.1 知识点分析1树的定义和术语(1)树树是n(n0)个有限数据元素的集合。在任意一棵非空树T中,有且仅有一个特定的称为树根(Root)的结点(根结点无前驱结点),当n1时,除根结点之外的其余结点被分成m(m0)个互不相交的集合T1,T2,Tm,其中每一个集合Ti(1 i m)本身又是一棵树,并且称为根的子树。(2)结点树的结点包含一个数据及若干指向其子树的分支。(3)结点的度一个结点所拥有的子树数称为该结点的度。(4)叶子(终端结点)度为零的结点称为终端结点,也称为叶子。(5)树的度树中各结点度的最大值称为该树的度。(6)树的深度树中结点的最大层数称为树的深度或高度。2二叉树(1)二叉树一棵非空的二叉树,每个结点至多只有两棵子树,分别称为左子树和右子树,左、右子树的次序不能任意交换,且左右子树又分别是一棵二叉树。(2)满二叉树一棵深度为h,且有2 h1个结点的二叉树称为满二叉树。(3)完全二叉树深度为h,有n个结点的二叉树,当且仅当每一个结点都与深度为h的满二叉树中编号从1至n的结点一一对应时,称此二叉树为完全二叉树。3关于二叉树的几个最常用的性质性质1 一棵非空二叉树的第i层上最多有2 i1个结点(i 1)。性质2 深度为h的二叉树中,最多具有2 h 1个结点(h 1)。性质3 对于一棵有n个结点的完全二叉树,若按满二叉树的同样方法对结点进行编号,则对于任意序号为i的结点,有:(1)若i1,则序号为i的结点的父结点的序号为i/2;(2)若2in,则序号为i的结点的左孩子结点的序号为2i;(3)若2i+1n,则序号为i的结点的右孩子结点的序号为2i+1。4遍历二叉树二叉树的遍历是指按某种顺序访问二叉树中的所有结点,使得每个结点都被访问,且仅被访问一次。通过一次遍历,使二叉树中结点的非线性序列转变为线性序列。(1)二叉树前序遍历二叉树前序遍历先访问根结点,再前序遍历左子树,最后前序遍历右子树。(2)二叉树中序遍历二叉树中序遍历先中序遍历左子树,再访问根结点,最后中序遍历右子树。(3)二叉树后序遍历二叉树后序遍历先后序遍历左子树,再后序遍历右子树,最后访问根结点。(4)层次遍历从根结点开始,按照自上而下,从左到右(同一层)的顺序逐层访问二叉树上的所有结点,这样的遍历称为按层次遍历。5线索二叉树n 个结点的二叉树有n+1个空指针域,可以充分利用二叉链表存储结构中的那些空指针域,来保存结点在某种遍历序列中的直接前驱和直接后继的地址信息。指向直接前驱结点或指向直接后继结点的指针称为线索,带有线索的二叉树称为线索二叉树。对二叉树以某种次序遍历使其变为线索二叉树的过程称为线索化。由于二叉树的遍历方法不同,因此线索二叉树的方法也有多种。其中以中序线索化用得最多。线索二叉树的画法,先写出二叉树的某种遍历的序列,若左孩子为空,则此线索指针将指向前一个遍历次序的结点,右孩子为空,则此线索指针将指向下一个遍历次序的结点,左右不为空时,则不须画。6恢复二叉树(1)对于已知二叉树的前序和中序序列,可以根据前序序列确定树的根(首结点),根据中序序列确定左子树和右子树。(2)对于已知二叉树的后序和中序序列,可以根据后序序列确定树的根(尾结点),根据中序序列确定左子树和右子树。7标识符树将算术表达式用二叉树来表示称为标识符树,也称为二叉表示树。利用标识符树的后序遍历可以得到算术表达式的后缀表达式,是二叉树的一种重要应用。8哈夫曼树及哈夫曼编码(1)路径长度从树中的一个结点到另一个结点之间的分支构成两个结点间的路径,路径上的分支数目,称作路径长度。(2)结点的带权路径长度从该结点到树根之间路径长度与该结点上权的乘积。(3)树的带权路径长度树中所有叶子结点的带权路径长度之和,称为树的带权路径长度。(4)哈夫曼树带权路径长度最小的二叉树,称为最优二叉树,也称为哈夫曼树。(5)哈夫曼编码哈夫曼树从根结点到每个叶结点都有一条唯一的路径,规定哈夫曼树中的左分支代表0,右分支代表1,则从根结点到每个叶结点所经过的路径分支组成的0和1的序列即为该结点对应的哈夫曼编码。7.2 典型习题分析【例1】 度为2的树与二叉树有什么区别?答: 一棵度为2的树与一棵二叉树的区别在于:对于度为1和度为2的树无须区分左右子树,但对于二叉树则必须区分左右子树,且左右子树不能任意交换。【例2】一般树和二叉树有什么区别?答: 一般树(非空)除了根结点之外,每个结点有且仅有一个前驱结点,但每个结点都可以有多个互不相交的子集(后继结点)。二叉树(非空)除了根结点之外,每个结点有且仅有一个前驱结点,但每个结点至多只有两个后继结点,称为左子树和右子树,左、右子树的次序不能交换,且左右子树又分别都是二叉树。一般树和二叉树主要有以下区别:(1) 二叉树结点的度最大为2,而一般树结点的最大度数无限制;(2) 一般树的结点无左、右之分,而二叉树的结点有左、右之分。【例3】一棵二叉树的先序、中序、后序序列分别如下,其中一部分未给出,填写空格处的内容,并画出二叉树。先序序列: B F ICEH G中序序列:D KFIA EJC 后序序列: K FBHJ G A分析:(1)后序的首结点必等于中序的首结点D,后序的尾结点必等于先序的尾结点G;(2)根据后序确定A为根结点,因此先序的首结点为A,再根据中序划分左、右子树;CABDFKIGEHJ(3)根据后序确定B为A的左子树的根;(4)根据先序确定C为A的右子树的根;(5)交替使用(1)(4)可以确定:先序序列:ABDFKICEHJG中序序列:DBKFIAHEJCG后序序列:DKIFBHJEGCA其二叉树如图7-1所示。 图7-1 恢复二叉树【例4】 画出图7-2二叉树对应的森林。 图7-2 二叉树分析:原二叉树的根结点的右子树肯定是森林,而孩子结点的右子树均为兄弟,画出原二叉树对应的森林如图7-3所示。DABHCJEKGFIM 图7-3 二叉树对应的森林【例5】 高度为h的完全二叉树至少有几个结点?最多有几个结点?分析: 设根为第1层,当完全二叉树高度为h时,其前h-1层是高度为h-1层的满二叉树,共有2h-1-1个结点,第h层上至少有1个结点,因此高为h的完全二叉树至少有2h-1-1+1=2h-1个结点。显然高为h的完全二叉树为满二叉树时,结点数最多,结点数为2h-1个。【例6】一棵k个结点的二叉树是左单支树,按一维数组形式顺序存储,需要几个结点的存储空间?分析: 左单支树必须扩充为完全二叉树的形式才能使用一维数组进行存储。设根结点的编号为1,沿着左分支往下各结点的编号依次为:2,4,2k-1,因此需要2k-1个结点的存储空间。【例7】 给定一棵二叉树,输出其嵌套括号表示。分析:显然,选用先序遍历为宜。先输出根结点,再递归遍历二叉树的左子树,再递归编历二叉树的右子树。在输出左子树之前先输出开括号“(”,在输出右子树之后要输出闭括号“)”;若左右子树均为空,则不必输出。输出二叉树的算法:typedef struct BT datatype data; BT *lchild; BT *rchild;BTvoid outbt (BT *T)if (T !=NULL) printf (“%c” ,T-data);if (T-lchild!=NULL | T-rchild!=NULL);printf (“( ”); / 只要左、右子树有一个非空,输出开括号outbt (T- lchild) / 递归处理二叉树的左子树if (T-lchild!=NULL)printf (“, ”); / 左、右子树用逗号分割outbt (T-rchild); / 递归处理二叉树的右子树printf (“) ”); 【例8】 编写一个算法判断两棵二叉树是否等价。分析:设T1,T2分别是两棵二叉树的根指针,所谓等价,有以下几种可能:(1) 若T1,T2都为空,则两棵二叉树等价;(2) 若一棵二叉树为空,而另一棵不空,则两棵二叉树不相等;(3) 若T1,T2都不为空,则分别对相应的子树作判断。算法如下:typedef struct BT datatype data; BT *lchild; BT *rchild;BTint equal (T1,T2)BT T1,T2;int Y1, Y 2; / Y1、Y2用以存放判断结果if (T1=NULL & T2= NULL) / T1,T2都为空,则两棵二叉树等价 printf (“两棵二叉树等价! ”);else Y1= equal (T1-lchild, T2-lchild); / 左子树等价,返回值在Y1中Y2= equal (T1-rchild, T2-rchild); / 右子树等价,返回值在Y2中if (Y1 & Y2); / 左、右子树均等价,则二叉树等价 printf (“两棵二叉树等价! ”);else printf (“两棵二叉树不等价! ”); 【例9】本章单元练习,单选题(18):用5个权值3, 2, 4, 5, 1构造的哈夫曼树的带权路径长度是( )。32 33 34 15 分析:本题首先构造哈夫曼树如图7-4,然后求带权路径长度。6339451512图7-4 构造哈夫曼树带权路径长度WPL=(1+2)*3+(3+4+5)*2=33 ,所以选B。【例10】设有一段正文由字符集A,B,C,D,E,F中的字母组成,六个字母在正文中出现的频度分别为:12、18、26、6、4、32。(1)请为这六个字母设计哈夫曼编码。(2)若这段正文开始部分的二进制代码序列为:0110001001011010100,请将它译成对应的正文。分析: 在正文中每个字母出现的频度,即叶结点的权值,按权值4、6、12、18、26、32先构造一棵哈夫曼树。为了保证夫曼编码的唯一性,在构造造哈夫曼树时,要求所有结点左子树权值不大于右子树权值。构造哈夫曼树如图7-5所示。16418102640D223460D10000D012D00001111AECDBF 图7-5 哈夫曼树和哈夫曼编码将二进制代码序列按哈夫曼编码译成正文的方法:从哈夫曼树的根结点出发,从待译码的二进制码中逐位取码,与二叉树分支上标明的“0”、“1”相匹配,确定一条到达叶子结点的路径。若码是“0”,则沿左分支走,否则沿右分支走到下一层的结点,一旦到达叶子结点,则译出一个字母。然后再从哈夫曼树的根结点出发,从二进制代码的下一位开始继续按上述方法译码,值到所有的编码译完,可以得到如表7-1所示的哈夫曼编码表。对于本题二进制代码序列:0110001001011010100,参照表7-1哈夫曼编码表,可以译成对应的序列为:ABECFDB。表7-1 造哈夫曼编码表字母编号对应编码出现频率A01112B0018C1026D01016E01004F1134【例11】 根据图7-5二叉树,画出线索二叉树,写出对二叉树进行中序线索化的算法。NULLNULL08A28DBDCDDDEDFDGDHD08A28DBCDDdDEDFDGDHD 图7-5 二叉树 图7-6线索二叉树分析:(1)先写出二叉树的中序遍历序列:D B H E A F C G。中序线索二叉树如图7-6所示。(2)在线索二叉树中,为了区别每个结点的左、由指针域存放的是孩子的指针还是线索,必须在结点结构中增加两个线索标志域:ltag= 0 lchild域指向结点的左孩子 1 lchild域指向结点的中序编历次序下的前驱(左线索)rtag= 0 rchild域指向结点的右孩子 1 rchild域指向结点的中序编历次序下的后继(右线索) 其结点结构为:lchildltagtadartagrchild结点类型和相应结点的指针类型定义如下: Typedef struct tnode char data; int ltag,rtag; / 标志ltag,rtag取值只能是0或1 struct tnode *lchild,*rchild; / 左、右子树指针 bt; 算法思想:一边中序编历一边建立线索。若访问结点的左孩子为空,则建立前驱线索;若访右孩子为空,则建立后继线索。函数如下: void thread(p,q) bt *p,*q; / p为当前结点,q为p的前驱结点,开始调用时p为根结点的指针,q为NULL if (p!=NULL) thread(p-lchild,q) / 左子树线索化若当前结点的左子树为空,则建立指向其前驱结点的前驱线索 if(p-lchild=NULL) p-ltag=1; p-left=q; else p-ltag=0;/ 若前驱结点不为空,且其右子树为空,则建立该前驱结点指向当前结点的后继线索 if (q!=NULL & q-rchild=NULL) q-rtag=1; q-rchild=p;else p-rtag=0;q=p; / 中序向前遍历一个结点thread(ht-rchild,q)7.3 单元练习7解答一判断题答案题目12345678910答案二填空题答案(1)度(2)叶(或叶子,或终端)(3)深度(或高度)(4)2i-1(5)2h-1(6)中序(7)5(8)最小(9)中序(10)D A B E C(11)E、F、H(12)68(13)右子树(14)2n(15)n+1(16)4 (四种二叉树如下图)ACBABCABCACB(17)2(18)2*i(19)A B E F H C G(20)A B C E F G H三选择题答案题目12345678910答案DDCBCACBDA题目11121314151617181920答案DDACBBDBCC四. 简答题答案EABDFMCGLNKJHI(1)画出的树如右图。 A是根结点。 叶结点:M,N,D,J,K,F,I。 G的双亲:C。 G的祖先:A,C。 G的孩子:J,K。 E的子孙:L,M,N。 E的兄弟:D;F的兄弟:G,H。 结点B的层次为2;结点N的层次是5。 树的深度是5。 以结点C为根的子树的深度是3。 树的度数是3。 (树中各结点度的最大值即树的度)(2) 分析: 本题首先要把二叉树还原为森林,还原为森林以后,就不难回答问题。ABECFGJLKDIHDABEGICFHJLK 连线 删除原二叉树中所有父结点与右孩子结点的连线还原为森林 4 A,C,G,K 6 2 7(3)二叉树按中序遍历的结果为ABC的二叉树有5种。CBAAADCBBABCACCB (4)三个结点的树有2种。 三个结点的二叉树树有5种。 五. 应用题答案(1)恢复的二叉树为: BCHDDFGEIA其前序遍历的序列为:E B A D C F H G I(2)恢复的二叉树为:GHABDCEFI 其后序遍历的序列为:G H D B E I F C A(3)分析:先按层次遍历序列和中序遍历序列恢复二叉树,其方法是:先根据层次遍历序列确定根结点(首结点A);根据中序遍历序列确定左、右子树。因为左、右子树均存在,可以确定层次遍历序列中的第二个结点B和第三个结点C分别为左、右子树的根。再根据中序序列确定B存在左、右子树,C只有右子树;再根据层次遍历序列可以确定D、E、F的位置,恢复后的二叉树为:ABCHDDFGEIJ其序遍历的序列:D G J H E B I F C A (4)把下列一般树转换为二叉树12468 8D537 ABCHDDFGEIJ(5)森林转换为二叉树如下:KABCHDDFGEI(6)把下列二叉树还原为森林如下:ABCHDDFGEI(7) ADHFGECBI 画出二叉树 层次遍历的结点序列:E A F D H C G I B8 BDJHGACFEI 根据存储结构画出二叉树: 前序遍历的结点序列:A B C E D F H G I J(9)中序遍历序列:55 40 25 60 28 08 33 54中序线索二叉树:28DNULL33D25DNULL54D08D60D40D55D(10) -A+B-C+D 的标识符树:+BDCAD0 后缀表达式:0 A B + C D + ABC+DDFGE/+*(11)(A+B/C-D)*(E*(F+G)的标识符树: 后缀表达式:A B C / + D E F G + * *EGFD*B+*AD/C(12)(A+B*C/D)*E+F*G的标识符树:后缀表达式:A B C * D / + E * F G * +(13) 哈夫曼树:351325D12660181798D4574 5 6 7 8 12 18 9 13 17 25 35 60 WPL=(12+18)*2+(6+7+8)*3+(4+5)*4=159(14) 哈夫曼树:491733D1698229201514D56113D2 2 3 6 9 14 15 16 175 29 33 11 20 49 82WPL=(16+17)*2+(9+14+15)*3+6*4+(2+3)*5=229(15)假设用于通信的电文仅由A、B、C、D、E、F、G 、H 8个字母组成,字母在电文中出现的频率分别为7,19,2,6,32,3,21,10。试为这8个字母设计哈夫曼编码。答:以权值:2、3、6、7、10、19、21、32构造哈夫曼树:651911281740D213260D10000D023D710D0000111111 01先构造哈夫曼树: 哈夫曼编码:字母编号对应编码出现频率A10107B0019C100002D10016E1132F100013G0121H101110 0六算法设计题答案(1)【函数代码】void count(BT t) if (t) if (t-lchild & t-rchild) k+; count(t-lchild); count(t-rchild);(2)【函数代码】int maxnode(BT t, int max) if (t) if (t-datamax) max=t-data;max=maxnode(t-lchild,max);max=maxnode(t-rchild,max);(3)【函数代码】void create(BT t,int a ,int i) if (t) ai=t-data; create (t-lchild, a, 2*i); create (t-rchild, a, 2*i+1);(4)【函数代码】void preorderlevel (BT t,int h) / t的层数为h if (t!=NULL) printf (“%d,%d”,t-data, h); preorderlevel (t-lchild, h+1); preorderlevel (t-rchild, h+1);(5) 分析:按层遍历二叉树,采用一个队列q,让根结点入队列,最后出队列,若有左右子树,则左右子树根结点入队列,如此反复,直到队列为空。【函数代码】 int Width(BT *T) int front=-1,rear=-1; / 队列初始化 int flag=0,count=0,p; / p用于指向树中层的最右边的结点,标志flag记录层中结点数的最大值 if (T!=NULL) rear+; qrear=T; flag=1; p=rear; while (frontlchild!=NULL) rear+; qrear=T-lchild; count+; if (T-rchild!=NULL) rear+; qrear=T-rchild; count+; if (front=p) / 当前层已遍历完毕 if (flagcount) flag=count; count=0; p=rear;/ p指向下一层最右边的结点 / endwhile return(flag); (6)【程序代码】#includeSwap(BinTree*T) BinTree *stack100, *temp; int top=-1; root=T;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年风电变流器行业当前发展趋势与投资机遇洞察报告
- 2025年建筑安装行业当前竞争格局与未来发展趋势分析报告
- 2025年NB-IOT技术行业当前竞争格局与未来发展趋势分析报告
- 支架现浇梁施工培训课件
- 地质工程地质灾害防治知识竞赛题集及答案解析
- 2025年网络安全知识及信息系统故障应急演练培训考核测试题库含答案
- 2025年护士资格考试理论知识复习题库及答案
- 摩托车装备基本知识培训课件
- 2025年社会工作者之初级社会综合能力基础试题库和答案
- 2025年黑龙江省绥化市【国家公务员】公共基础知识预测试题含答案
- 工程例会管理制度
- 企业员工职业道德考核制度
- 公司安全事故隐患内部举报、报告奖励制度
- 产品方案设计模板
- 产科手术麻醉
- 【初中物理】质量与密度练习题 2024-2025学年初中物理人教版八年级上册
- 新时代青年做好新时代使命担当人
- 2-U9C操作培训-MRP运算
- 【上海市塑料探究所企业员工激励机制存在的问题及优化建议探析(论文)8200字】
- 浙教版二年级下册递等式计算题100道及答案
- 安全管理核心制度综合体系华润置地北京
评论
0/150
提交评论