数据结构与算法分析 第5章.ppt
《数据结构与算法分析 第5章.ppt》由会员分享,可在线阅读,更多相关《数据结构与算法分析 第5章.ppt(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第5 5章章 树树 5.1 5.1 树的概念树的概念 5.2 5.2 二叉树的定义二叉树的定义5.3 5.3 二叉树的性质二叉树的性质5.4 5.4 二叉树的存储结构二叉树的存储结构5.5 5.5 二叉树的遍历二叉树的遍历5.6 5.6 线索二叉树线索二叉树 5.7 5.7 树和二叉树的转换及树的存储结构树和二叉树的转换及树的存储结构 5.8 5.8 哈夫曼树及其应用哈夫曼树及其应用5.1 5.1 树的概念树的概念5.1.1 5.1.1 树的定义树的定义 树是一种数据结构,表示为TREE=(D,R);其中:D是具有相同特性的数据元素的集合;R是元素集合D上的关系集合,如果D中只含有一个数据元
2、素,则R为空集。或者用递归定义为:树是N(N0)个结点的有限集合,其唯一关系具有下列属性:集合中存在唯一的一个结点,称为树根,该结点没有前驱;除根结点外,其余结点分为M(M0)个互不相交的集合,其中每一个集合都是一棵树,并称其为根的子树。5.1 5.1 树的概念树的概念5.1.2 5.1.2 基本术语基本术语一个结点的子树个数称为该结点的度(一个结点的子树个数称为该结点的度(degree)一棵树中结点度的最大值称为该树的度一棵树中结点度的最大值称为该树的度度为零的结点称为叶子(度为零的结点称为叶子(leafleaf)或者终端结点或者终端结点 度不为零的结点称为分支结点或者非终端结点度不为零的结
3、点称为分支结点或者非终端结点除根结点之外的分支结点统称为内部结点除根结点之外的分支结点统称为内部结点 树中结点的后继结点称为儿子(树中结点的后继结点称为儿子(childchild)或者儿子结点,或者儿子结点,简称儿子简称儿子 结点的前驱结点称为儿子的双亲(结点的前驱结点称为儿子的双亲(parents)或者父亲结或者父亲结点,简称父亲点,简称父亲同一个父亲的儿子互称为兄弟(同一个父亲的儿子互称为兄弟(sibling)5.1 5.1 树的概念树的概念若树中存在一个结点序列若树中存在一个结点序列k k1 1k k2 2k k3 3k kj j,使得使得k ki i是是k ki i+1+1的父亲的父亲
4、(11i ij j),),则称该结点序列是从则称该结点序列是从k k1 1到到k kj j的一条路径的一条路径(pathpath)或者道路或者道路 路径的长度等于路径的长度等于j-1j-1,它是该路径所经过的边(即连接两它是该路径所经过的边(即连接两个结点的线段)的数目个结点的线段)的数目若树中结点若树中结点k k到到k ks s存在一条路径,则称存在一条路径,则称k k是是k ks s的祖先的祖先(AncestorAncestor),),k ks s是是k k的子孙(的子孙(DescendantDescendant)结点的层数(结点的层数(levellevel)是从根开始算起的。设根结点的层
5、是从根开始算起的。设根结点的层数为数为1 1,其余结点的层数等于其父亲结点的层数加,其余结点的层数等于其父亲结点的层数加1 1树中结点的最大层数称为树的高度(树中结点的最大层数称为树的高度(HeightHeight)或者深度或者深度(DepthDepth)5.1 5.1 树的概念树的概念若把树中每个结点的各子树看成从左到右有次序的(即若把树中每个结点的各子树看成从左到右有次序的(即不能互换),则称该树为有序树(不能互换),则称该树为有序树(OrderedTree););否则否则称为无序树(称为无序树(UnorderedTree)森林(森林(ForestForest)是是m m(m0m0)棵互不
6、相交树的集合棵互不相交树的集合 树形结构是非线性结构树形结构是非线性结构 祖先与子孙的关系则是对父子关系的延伸,其定义了树祖先与子孙的关系则是对父子关系的延伸,其定义了树中结点的纵向次序中结点的纵向次序 如果规定如果规定k1和和k2是兄弟,且是兄弟,且k1在在k2的左边,则的左边,则k1的任一子的任一子孙都在孙都在k2的任一子孙的左边,则定义了树中结点的横向的任一子孙的左边,则定义了树中结点的横向次序次序 5.2 5.2 二叉树的定义二叉树的定义 二叉树是由n(n0)结点的有限集合,此集合或者为空,或者由一个根结点加上两棵分别称为左、右子树的,互不相交的二叉树组成二叉树可以为空集,因此根可以有
7、空的左子树或者右子树,亦或者左、右子树皆为空 从二叉树定义中可以看出,二叉树结构与一般树结构区别如下:(1)二叉树可以为空树,即不包含任何结点;一般树至少应有一个结点。(2)二叉树区别于度数为2的有序树,在二叉树中允许某些结点只有右子树而没有左子树;而有序树中,一个结点如果没有第一子树就不可能有第二子树的存在。5.3 5.3 二叉树的性质二叉树的性质 5.3.1 5.3.1 二叉树性质二叉树性质性质1二叉树第i(i1)层上的结点数最多为2i-1 性质2高度为k的二叉树最多有2k-1个结点 性质3对任何二叉树T,设n0、n1、n2分别表示度数为0、1、2的结点个数,则n0=n2+1 5.3 5.
8、3 二叉树的性质二叉树的性质性质4具有n个结点的完全二叉树(包括满二叉树)的高度为(或者)性质5满二叉树原理非空满二叉树的叶结点数等于其分支结点数加1性质6一棵非空二叉树空子树的数目等于其结点数目加1 5.3 5.3 二叉树的性质二叉树的性质5.3.2 5.3.2 二叉树的抽象数据类型二叉树的抽象数据类型 下列给出一个二叉树结点的JAVA接口,称之为BinNode。BinNode类中存储了指向Object类的引用。创建二叉树时,可以根据需要而采用实际的数据类型。成员函数包括返回元素的值,返回左、右结点指针,设置元素的值,以了标志该结点是否为叶结点。interface BinNode /二叉树结
9、点的抽象数据类型/返回并设置元素值public Object element();public Object setElement(Object v);5.3 5.3 二叉树的性质二叉树的性质/返回并设置左孩子publicBinnodeleft();publicBinnodesetLeft(BinNodep);/返回并设置右孩子publicBinnoderight();publicBinnodesetRight(BinNodep);/判断是否为叶结点publicbooleanisLeaf();/interfaceBinNode5.4 5.4 二叉树的存储结构二叉树的存储结构 5.4.1 5.4
10、.1 二叉树顺序存储结构二叉树顺序存储结构 二叉树的顺序存储结构是把二叉树的所有结点按照一定的次序顺序存储到一组包含n个存储单元的空间中 二叉树顺序存储的原则是:不管给定的二叉树是不是完全二叉树,都看作完全二叉树,即按完全二叉树的层次次序(从上到下,从左到右)把各结点依次存入数组中 5.4 5.4 二叉树的存储结构二叉树的存储结构在顺序存储结构中,由某结点的存储单元地址可以推出其父亲、左儿子、右儿子及兄弟的地址,假设给定结点的地址为I,则:(1)若I1,则该结点是为根结点,无父亲。(2)若I1,则该结点的父亲结点地址为I2的整数部分。(3)若2In,则该结点的左儿子结点地址为2I,否则该结点无
11、左儿子。(4)若2I+1n,则该结点的右儿子结点地址为2I+1,否则该结点无右儿子。(5)若I为奇数(不为1),则该结点的左兄弟为I-1。(6)若I为偶数(不为n),则该结点的右兄弟为I+1。5.4 5.4 二叉树的存储结构二叉树的存储结构5.4.2 5.4.2 二叉树的链接存储结构二叉树的链接存储结构 二叉树的链接存储中每个结点由数据域和指针域两部分组成 二叉树每个结点的指针域有两个,一个指向左儿子,一个指向右儿子 还需一个链表的头指针指向根结点 二叉树的链接存储结构也称为二叉链表 若二叉树为空,则根结点为NULL 5.4 5.4 二叉树的存储结构二叉树的存储结构5.4.3 5.4.3 二叉
12、树的实现举例二叉树的实现举例1以数组方式实现二叉树以数组方式实现二叉树 先依次序输入元素值,一一建立二叉树数组,其中根结先依次序输入元素值,一一建立二叉树数组,其中根结点的下标为点的下标为1,其余结点的建立则遵循左小(,其余结点的建立则遵循左小(level*2)右右大(大(level*2+1)的原则,最后输出所建立二叉树的结点的原则,最后输出所建立二叉树的结点内容。内容。importConsoleReader.*;/引入数据输入类引入数据输入类publicclassbitree01publicstaticvoidmain(Stringargs)5.4 5.4 二叉树的存储结构二叉树的存储结构i
13、nti;/循环变量intIndex=1;/数组下标变量intData;/读取输入值的临时变量BiTreeArrayBiTree=newBitreeArray();/声明二叉树数组System.out.printin(“请输入二叉树数据元素(输入0退出!):”);ConsoleReaderconsole=newConsoleReader(System.in);do/依次序读取结点值System.out.print(“Data”+Index+”:”);Data=console.readInt();Bitree.Create(Data);/建立二叉树Index+;while(Data!=0);5.4
14、 5.4 二叉树的存储结构二叉树的存储结构BiTree.PrintAll();/输出二叉树的结点值classBiTreeArrayintMaxSize=16;intABiTree=newintMaxSize;publicvoidBiTreeArray()inti;for(i=0;iMaxSize;i+)ABiTreei=0;5.4 5.4 二叉树的存储结构二叉树的存储结构/建立二叉树publicvoidCreate(intData)inti;intLevel;/树的层数Level=1;/从层1开始建立while(ABiTreeLevel!=0)/判断是否存在子树ifDataABiTreeLev
15、el)/判断是左子树?还是右子树?Level=Level*2;/左子树elseLevel=Level*2+1;/右子树ABiTreeLevel=Data;/将元素值插入结点 5.4 5.4 二叉树的存储结构二叉树的存储结构/输出二叉树结点值publicvoidPrintAll()inti;System.out.println(“二叉树结点值依次是:”);for(i=1;iMaxSize;i+)System.out.print(“Node”+i);System.out.println(“:“+ABiTreei+”);5.4 5.4 二叉树的存储结构二叉树的存储结构2数组方式实现二叉树的链接存储数
16、组方式实现二叉树的链接存储 以下示例为以结点数组方式建立二叉树,并输出结点内容。依次序输入结点值,并存入数组中,再一一建立成二叉树数组,其中根结点的下标为0,其余结点的建立则遵守左字段存左子结点的下标,右字段存右子结点下标的原则,最后输出所建立二叉树的结点值。importConsoleReader.*;/引入己定义的数据输入类publicclassbitree02publicstaticvoidmain(StringargS)5.4 5.4 二叉树的存储结构二叉树的存储结构inti;/循环变量intindex=l;/数组下标变量intdata;/输入值所使用的临时变量BiTreeArrayBi
17、Tree=newBiTreeArray();/声明二叉树数组System.out.println(请输入二叉树结点值(输入0退出0):”);ConsolReaderconsole=newConsoleReader(SyStem.in);System.out.print(“Data“+index+”:“);Data=console.readInt();BiTree.TreeData0=data;index+;5.4 5.4 二叉树的存储结构二叉树的存储结构while(true)/读取输入值System.out.print(“Data“+index+”:“);data=console.readIn
18、t();if(data=0)break;BiTree.Create(data);/建立二叉树index+;BiTree.PrintAll();/输出二叉树的内容5.4 5.4 二叉树的存储结构二叉树的存储结构classBiTreeArrayintMaxSize=16;intTreeData=newintMaxSize;intRightNode=newintMaxSize;intLeftNode=newintMaxSize;publicBiTreeArray()inti;/循环变量for(i=0;iTreeDataLevel)/右子树是否有下一层if(RightNodelevel!=-1)lev
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构与算法分析 第5章 数据结构 算法 分析
限制150内