数据结构-树和二叉树课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构-树和二叉树课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 二叉 课件
- 资源描述:
-
1、第第6章章 树和二叉树树和二叉树6.1 树的定义和基本术语树的定义和基本术语6.2 二叉树二叉树6.3 遍历二叉树遍历二叉树6.4 线索二叉树线索二叉树6.5 树和森林树和森林6.6 哈夫曼树哈夫曼树教学目的、要求教学目的、要求l1领会树和二叉树的类型定义,理解树和二叉树的结构差别。领会树和二叉树的类型定义,理解树和二叉树的结构差别。l2熟记二叉树的主要特性,并掌握它们的证明方法。熟记二叉树的主要特性,并掌握它们的证明方法。l3熟练掌握二叉树的各种遍历算法,并能灵活运用遍历算法实现二叉树熟练掌握二叉树的各种遍历算法,并能灵活运用遍历算法实现二叉树的其它操作。的其它操作。l4理解二叉树的线索化过
2、程以及在中序线索化树上找给定结点的前驱和理解二叉树的线索化过程以及在中序线索化树上找给定结点的前驱和后继的方法。后继的方法。l5熟练掌握二叉树和树的各种存储结构及其建立的算法。熟练掌握二叉树和树的各种存储结构及其建立的算法。l6学会编写实现树的各种操作的算法。学会编写实现树的各种操作的算法。l7了解最优树的特性,掌握建立最优树和赫夫曼编码的方法。了解最优树的特性,掌握建立最优树和赫夫曼编码的方法。6.1 树的定义和基本术语树的定义和基本术语6.1.1树的定义树的定义l树是由树是由n(n0)个结点组成的有限集合。若)个结点组成的有限集合。若n=0,称为空树;若称为空树;若n0,则:,则:有一个特
3、定的称为根(root)的结点。它只有直接后继,但没有直接前驱;除根结点以外的其它结点可以划分为m(m0)个互不相交的有限集合T0,T1,Tm-1,每个集合Ti(i=0,1,m-1)又是一棵树,称为根的子树,每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继。l由此可知,树的定义是一个递归的定义,即树的定由此可知,树的定义是一个递归的定义,即树的定义中又用到了树的概念。义中又用到了树的概念。树的结构参见下图:树的结构参见下图:图6.1树的结构l在图在图6.1(c)6.1(c)中,树的根结点为中,树的根结点为A A,该树还可以分为三个互不相交子集,该树还可以分为三个互不相交子集T T
4、0 0,T T1 1,T T2 2,其中,其中T T0 0=B=B,E E,F F,J J,K K,LL,T T1 1=C=C,GG,T T2 2=D=D,H H,I I,MM,其中的其中的T T0 0,T T1 1,T T2 2都是树,称为图都是树,称为图6 6.1(C)1(C)中树的子树,而中树的子树,而T T0 0,T T1 1,T T2 2又可又可以分解成若干棵不相交子树。如以分解成若干棵不相交子树。如T T0 0可以分解成可以分解成T T0000,T T0101两个不相交子集,两个不相交子集,T T0000=E=E,J J,K K,LL,T T0101=F=F,而,而T T0000又
5、可以分为三个不相交子集又可以分为三个不相交子集T T000000,T T001001,T T002002,其中,其中,T T000000=J=J,T T001001=K=K,T T002002=L=L。l树的抽象数据类型定义见教材树的抽象数据类型定义见教材P118-1196.1.2 基本术语基本术语l1.结点结点l指树中的一个数据元素,一般用一个字母表示。指树中的一个数据元素,一般用一个字母表示。l2.度度l一个结点包含子树的数目,称为该结点的度。一个结点包含子树的数目,称为该结点的度。l3.树叶(叶子)树叶(叶子)l度为度为0的结点,称为叶子结点或树叶,也叫终端结点。的结点,称为叶子结点或树
6、叶,也叫终端结点。l4.孩子结点孩子结点l若结点若结点X有子树,则子树的根结点为有子树,则子树的根结点为X的孩子结点,也称的孩子结点,也称为孩子,儿子,子女等。如图为孩子,儿子,子女等。如图6.1(c)中)中A的孩子为的孩子为B,C,D。l5.双亲结点双亲结点l若结点若结点X有子女有子女Y,则,则X为为Y的双亲结点。的双亲结点。l6.祖先结点祖先结点l从根结点到该结点所经过分枝上的所有结点为该结点的从根结点到该结点所经过分枝上的所有结点为该结点的祖先,如图祖先,如图6-1(c)中)中M的祖先有的祖先有A,D,H。l7.子孙结点子孙结点l某一结点的子女及子女的子女都为该结点子孙。某一结点的子女及
7、子女的子女都为该结点子孙。l8.兄弟结点兄弟结点l具有同一个双亲的结点,称为兄弟结点。具有同一个双亲的结点,称为兄弟结点。l9.分枝结点分枝结点l除叶子结点外的所有结点,为分枝结点,也叫非终端结除叶子结点外的所有结点,为分枝结点,也叫非终端结点。点。l10.层数层数l根结点的层数为根结点的层数为1,其它结点的层数为从根结点到该结,其它结点的层数为从根结点到该结点所经过的分支数目再加点所经过的分支数目再加1。l11.树的深度(高度)树的深度(高度)l树中结点所处的最大层数称为树的高度,如空树的高度树中结点所处的最大层数称为树的高度,如空树的高度为为0,只有一个根结点的树高度为,只有一个根结点的树
8、高度为1。l12.树的度树的度l树中结点度的最大值称为树的度。树中结点度的最大值称为树的度。l13.有序树有序树l若一棵树中所有子树从左到右的排序是有顺序的,不能若一棵树中所有子树从左到右的排序是有顺序的,不能颠倒次序。称该树为有序树。颠倒次序。称该树为有序树。l14.无序树无序树l若一棵树中所有子树的次序无关紧要,则称为无序树。若一棵树中所有子树的次序无关紧要,则称为无序树。l15森林森林l若干棵互不相交的树组成的集合为森林。一棵树可以看若干棵互不相交的树组成的集合为森林。一棵树可以看成是一个特殊的森林。成是一个特殊的森林。6.1.3 树的表示树的表示1.树形结构表示法树形结构表示法2.凹入
9、法表示法凹入法表示法图图6.1(c)的树的凹入法表示)的树的凹入法表示3.嵌套集合表示法嵌套集合表示法图图6.1(c)的嵌套集合表示)的嵌套集合表示4.广义表表示法广义表表示法l对图对图6-1(c)的树结构,广义表表示法可表示为:)的树结构,广义表表示法可表示为:(A(B(E(J,K,L),),F),),C(G),),D(H(M),),I)6.1.4 树的性质树的性质l性质性质1 树中的结点数等于所有结点的度加树中的结点数等于所有结点的度加1。l证明:根据树的定义,在一棵树中,除根结证明:根据树的定义,在一棵树中,除根结点以外,每个结点有且仅有一个直接前驱,点以外,每个结点有且仅有一个直接前驱
10、,也就是说,每个结点与指向它的一个分支一也就是说,每个结点与指向它的一个分支一一对应,所以,除根结点以外的结点数等于一对应,所以,除根结点以外的结点数等于所有结点的分支数(即度数),而根结点无所有结点的分支数(即度数),而根结点无直接前驱,因此,树中的结点数等于所有结直接前驱,因此,树中的结点数等于所有结点的度数加点的度数加1。l性质性质2 度为度为k的树中第的树中第i层上最多有层上最多有ki-1个结点个结点(i1)。)。l下面用数学归纳法证明:下面用数学归纳法证明:l对于对于i=1,显然成立,假设对于,显然成立,假设对于i-1层,上述条层,上述条件成立,即第件成立,即第i-1层最多有层最多有
11、ki-2个结点,个结点,l对于第对于第i层,结点数最多为第层,结点数最多为第i-1层结点数的层结点数的k倍(因为度为倍(因为度为k),故第),故第i层的结点数为层的结点数为ki-2*k=ki-1。l性质性质3 深度为深度为h的的 k叉树最多有叉树最多有 个结点。个结点。l证明:证明:l由性质由性质2可知,若每一层的结点数最多,可知,若每一层的结点数最多,则整个则整个k叉树结点数最多,共有叉树结点数最多,共有l ll当一棵当一棵K叉树上的结点数达到叉树上的结点数达到 时,称为时,称为满满K叉树。叉树。11hKK1011111hhihiKKKKKK11hKKl性质性质4 具有具有n个结点的个结点的
12、k叉树的最小深度叉树的最小深度为为 。(表示取不小于表示取不小于x的最小整数)的最小整数)l证明:设具有证明:设具有n个结点的个结点的k叉树的深度为叉树的深度为h,在该,在该树的前面树的前面h-1层都是满的,即每一层的结点数等层都是满的,即每一层的结点数等于于ki-1个个(1ih-1),第,第h层(即最后一层)的结点层(即最后一层)的结点数可能满,也可能不满,这时,该树具有最小的数可能满,也可能不满,这时,该树具有最小的深度。深度。l由性质由性质3知道,结点数知道,结点数n应满足下面条件:应满足下面条件:log11Kn KX11111hhKKnKKl通过转换为:通过转换为:kh-1n(k-1)
13、+1kh,再取以,再取以k为为底的对数后,可以得到:底的对数后,可以得到:l h-1logk(n(k-1)+1)hl即有:即有:logk(n(k-1)+1)hn,则结点,则结点i无左孩子,否则无左孩子,否则i的左孩子为的左孩子为2i。即满。即满足足2in的结点为叶子结点;的结点为叶子结点;l若若2i+1n,则结点,则结点i无右孩子,否则无右孩子,否则i的右孩子为的右孩子为2i+1;l若结点若结点i为奇数且不等于为奇数且不等于1,则它的左兄弟为,则它的左兄弟为i-1;l若结点若结点i为偶数且不等于为偶数且不等于n,它的右兄弟为,它的右兄弟为i+1;l结点结点i所在层数所在层数(层次层次)为为 ;
14、2log1n log1nn/2i 2log1i 6.2.3 二叉树的存贮结构二叉树的存贮结构1.顺序存贮结构顺序存贮结构l按二叉树的结点按二叉树的结点自上而下、从左至右自上而下、从左至右编号,编号,用一组连续的存储单元存储。用一组连续的存储单元存储。l若该二叉树为非完全二叉树,则必须将相应若该二叉树为非完全二叉树,则必须将相应位置空出来,使存放的结果符合完全二叉树位置空出来,使存放的结果符合完全二叉树形状。形状。图6.7 二叉树的顺序存储对于一棵二叉树,若采用顺序存贮时,当它为完全二叉树时,比较方便,若为非完全二叉树,将会浪费大量存贮存贮单元。最坏的非完全二叉树是全部只有右分支,设高度为K,则
15、需占用2K-1个存贮单元,而实际只有k个元素,实际只需k个存储单元。因此,对于非完全二叉树,宜采用下面的链式存储结构。2.二叉链表存贮结构二叉链表存贮结构 二叉链表表示二叉链表表示l将一个结点分成三部分,一部分存放结点本身信息,将一个结点分成三部分,一部分存放结点本身信息,另外两部分为指针,分别存放左、右孩子的地址。另外两部分为指针,分别存放左、右孩子的地址。l注:如果需要倒查某结点的双亲,可以再增加一个注:如果需要倒查某结点的双亲,可以再增加一个双亲域(直接前趋)指针,将二叉链表变成三叉链双亲域(直接前趋)指针,将二叉链表变成三叉链表。表。lchilddatarchildl对于图对于图6.7
16、所示二叉树,用二叉链表形式描述。所示二叉树,用二叉链表形式描述。图6.8 二叉树的二叉链表表示 二叉链表的数据类型二叉链表的数据类型bitree.hl/二叉链表定义二叉链表定义l#include lusing namespace std;ltypedef char TElemType;lstruct BiTNodelTElemType data;lBiTNode*lchild,*rchild;l;ltypedef BiTNode*BiTree;lvoid initBiTree(BiTree&T);lvoid createBiTree(BiTree&T);l/递归前序遍历递归前序遍历lvoid
17、preOrderTraverse(BiTree T,void(*visit)(TElemType);l/非递归前序遍历非递归前序遍历lvoid preOrderTraverse1(BiTree T,void(*visit)(TElemType);l/递归中序遍历递归中序遍历l void inOrderTraverse(BiTree T,void(*visit)(TElemType);l/递归后序遍历递归后序遍历lvoid postOrderTraverse(BiTree T,void(*visit)(TElemType);二叉链表的建立二叉链表的建立l为了后面遍历二叉树方便,先介绍建立二叉为了
18、后面遍历二叉树方便,先介绍建立二叉链表的算法(假设链表的算法(假设ElemType 为为char型)。型)。l/按先序次序输入二叉树中结点的值(按先序次序输入二叉树中结点的值(#表示空格),表示空格),l/构造二叉链表表示的二叉树构造二叉链表表示的二叉树T。lvoid createBiTree(BiTree&T)lTElemType ch;lcinch;lif(ch=#)/空空lT=NULL;lelselT=new BiTNode;lif(!T)lexit(1);lT-data=ch;/生成根结点生成根结点lcreateBiTree(T-lchild);/构造左子树构造左子树lcreateBi
19、Tree(T-rchild);/构造右子树构造右子树ll6.3 遍历二叉树遍历二叉树l遍历是树结构插入、删除、修改、查找和排序运算遍历是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。的前提,是二叉树一切运算的基础和核心。l所谓所谓遍历二叉树遍历二叉树,就是遵从某种次序,访问二叉树,就是遵从某种次序,访问二叉树中的所有结点,使得每个结点仅被访问一次。中的所有结点,使得每个结点仅被访问一次。l这里提到的这里提到的访问访问是指对结点施行某种操作,操作是指对结点施行某种操作,操作可以是输出结点信息,修改结点的数据值等,但要可以是输出结点信息,修改结点的数据值等,但要求这种
20、访问不破坏它原来的数据结构。在本书中,求这种访问不破坏它原来的数据结构。在本书中,我们规定访问是输出结点信息我们规定访问是输出结点信息data,且以二叉链表,且以二叉链表作为二叉树的存贮结构。作为二叉树的存贮结构。l由于二叉树是一种非线性结构,每个结点可能有一由于二叉树是一种非线性结构,每个结点可能有一个以上的直接后继,因此,必须规定个以上的直接后继,因此,必须规定遍历的规则遍历的规则,并按此规则遍历二叉树,最后得到二叉树所有结点并按此规则遍历二叉树,最后得到二叉树所有结点的一个线性序列。的一个线性序列。l令令L、R、D分别代表二叉树的左子树、右子树、根分别代表二叉树的左子树、右子树、根结点,
21、则遍历二叉树有结点,则遍历二叉树有6种规则:种规则:DLR、DRL、LDR、LRD、RDL、RKD。若。若规定二叉树中必须先规定二叉树中必须先左后右左后右(左右顺序不能颠倒左右顺序不能颠倒),则只有,则只有DLR、LDR、LRD三种遍历规则。三种遍历规则。DLR称为前根遍历称为前根遍历(或前序遍历、或前序遍历、先序遍历、先根遍历先序遍历、先根遍历),LDR称为中根遍历称为中根遍历(或中序或中序遍历遍历),LRD称为后根遍历称为后根遍历(或后序遍历或后序遍历)。6.3.1 前序遍历前序遍历l所谓前序遍历,就是根结点最先遍历,其次所谓前序遍历,就是根结点最先遍历,其次左子树,最后右子树。左子树,最
22、后右子树。1.递归遍历递归遍历l前序遍历二叉树的递归遍历算法描述为:前序遍历二叉树的递归遍历算法描述为:l若二叉树为空,则算法结束;若二叉树为空,则算法结束;l否则否则l输出根结点;输出根结点;l前根遍历左子树前根遍历左子树;l前根遍历右子树。前根遍历右子树。l/先序递归遍历先序递归遍历T,对每个结点调用函数,对每个结点调用函数Visit一次且仅一次一次且仅一次lvoid preOrderTraverse(BiTree T,void(*visit)(TElemType)lif(T)/T不空不空lvisit(T-data);/先访问根结点先访问根结点lpreOrderTraverse(T-lch
23、ild,visit);/再先序遍历左子树再先序遍历左子树lpreOrderTraverse(T-rchild,visit);/最后先序遍历右子树最后先序遍历右子树ll2.非递归遍历非递归遍历l利用一个一维数组作栈,来存贮二叉链表中利用一个一维数组作栈,来存贮二叉链表中结点,算法思想为:结点,算法思想为:l从二叉树根结点开始,沿左子树一直走到末从二叉树根结点开始,沿左子树一直走到末端端(左孩子为空左孩子为空)为止,在走的过程中,访问所为止,在走的过程中,访问所遇结点,并依次把所遇结点进栈,当左子树遇结点,并依次把所遇结点进栈,当左子树为空时,从栈顶退出某结点,并将指针指向为空时,从栈顶退出某结点
24、,并将指针指向该结点的右孩子。如此重复,直到栈为空或该结点的右孩子。如此重复,直到栈为空或指针为空止。指针为空止。l/前序遍历二叉树前序遍历二叉树T的非递归算法的非递归算法(利用栈利用栈),对每个数据元素调用函数,对每个数据元素调用函数Visitlvoid preOrderTraverse1(BiTree T,void(*visit)(TElemType)lBiTree s100;lint top=0;/top为栈顶指针为栈顶指针lwhile(T!=NULL)|(top0)lwhile(T!=NULL)lvisit(T-data);l stop+=T;lT=T-lchild;llT=s-top
25、;lT=T-rchild;ll6.3.2 中序遍历中序遍历l所谓中序遍历,就是根在中间,先左子树,所谓中序遍历,就是根在中间,先左子树,然后根结点,最后右子树。然后根结点,最后右子树。l中序遍历二叉树的递归遍历算法描述为:中序遍历二叉树的递归遍历算法描述为:l若二叉树为空,则算法结束;若二叉树为空,则算法结束;l否则否则l中根遍历左子树中根遍历左子树;l输出根结点输出根结点;l中根遍历右子树。中根遍历右子树。l/中序递归遍历中序递归遍历T,对每个结点调用函数对每个结点调用函数Visit一次且仅一次一次且仅一次lvoid inOrderTraverse(BiTree T,void(*visit)
展开阅读全文