树与二叉树(java版).ppt
《树与二叉树(java版).ppt》由会员分享,可在线阅读,更多相关《树与二叉树(java版).ppt(171页珍藏版)》请在三一办公上搜索。
1、第五章 树与二叉树,教学内容,5.2 二叉树的基本概念,5.1 树的基本概念,5.4 哈夫曼树及哈夫曼编码,5.3 二叉树的遍历,5.5 树与森林,教学重点与难点,重点:,二叉树的性质;二叉树的存储方法二叉树的遍历及其应用哈夫曼编码,难点:,二叉树遍历算法的应用,课 前 思 考,你见过家族谱系图吗?试以图形表示从你的祖父起的家族成员关系。,这类图形正是本章要讨论的“树”结构。,5.1.1 树的定义,5.1.2 树的常用术语,5.1 树的基本概念,5.1.1 树的定义,树是由n(n0)个结点所构成的有限集合,当n=0时,称为空树;当n0时,n个结点满足以下条件:,有且仅有一个称为根的结点。,其余
2、结点可分为m(m0)个互不相交的有限集合,且每一个集合又构成一棵树,这棵树称为是根结点的子树。,5.1.1 树的定义,例如:,root,T1,T2,T3,5.1.1 树的定义,树的表示方法:,树形表示法,文氏图表示法,凹入图表示法,广义表(括号)表示法,5.1.1 树的定义,5.1.1 树的定义,5.1.1 树的定义,线性结构,树型结构,第一个数据元素(无前驱),存在一个根结点(无前驱),最后一个数据元素(无后继),存在多个叶子结点(无后继),其它数据元素(一个前驱、一个后继),其它结点(一个前驱(双亲)、多个后继(孩子),元素之间存在“一对一”的关系,元素之间存在“一对多”的关系,5.1.1
3、 树的定义,5.1.2 树的常用术语,5.1 树的基本概念,5.1.2 树的常用术语,结点:,结点的度:,树的度:,叶子结点:,分支结点:,数据元素+所有关联子树根的分支,结点所拥有子树的数目,树中所有结点的度的最大值,度为零的结点,度大于零的结点,分支:,根和子树根之间的连线(边),结点的路径:,由从根到该结点所经分支和结点构成,孩子结点、双亲结点兄弟结点、堂兄弟祖先结点、子孙结点,结点的层次:,树的深度:,树中所有结点层次数的最大值加1。,假设根结点的层次为0,则其它结点的层次是其双亲结点的层次数加1。,有序树:,树中各结点的所有子树之间从左到右有严格的次序关系。,无序树:,森林:,由m(
4、m0)棵互不相交的树所构成的集合。,与有序树相反,无序树是指树中各结点的所有子树之间没有严格的次序关系。,5.2.1 二叉树的定义,5.2.2 二叉树的性质,5.2.3 二叉树的存储结构,5.2 二叉树的基本概念,5.2.1 二叉树的定义,二叉树或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。,根结点,左子树,右子树,5.2.1 二叉树的定义,二叉树的五种基本形态:,N,空树,只含根结点,N,N,N,L,R,R,右子树为空树,L,左子树为空树,左右子树均不为空树,5.2.1 二叉树的定义,具有3个结点的树与二叉树的形态各有多少种?,树有2种而二叉树有5种。,问,
5、二叉树就是度小于等于2的树,这个结论是否正确?,满二叉树的定义,如果在一棵二叉树中,它的所有结点或者是叶结点,或者是左、右子树都非空,并且所有叶结点都在同一层上,则称这棵二叉树为满二叉树。,完全二叉树的定义,如果在一棵具有n个结点的二叉树中,它的逻辑结构与满二叉树的前n个结点的逻辑结构相同,则称这样的二叉树为完全二叉树,完全二叉树,非完全二叉树,单分支树的定义,左支树:,左支树,右支树,右支树:,所有结点都没有右孩子的二叉树。,所有结点都没有左孩子的二叉树。,5.2.1 二叉树的定义,5.2.2 二叉树的性质,5.2.3 二叉树的存储结构,5.2 二叉树的基本概念,5.2.2 二叉树的性质,在
6、二叉树的第 i 层上至多有2i 个结点。(i0),用归纳法证明:归纳基:归纳假设:归纳证明:,i=0 层时,只有一个根结点:20=1;,假设对所有的 j(0ji)层,命题成立;,则第 i层的结点数 2i-1 2=2i。,性质1:,5.2.2 二叉树的性质,深度为 h(h1)的二叉树上至多含 2h-1 个结点。,性质2:,证明:,基于上一条性质,深度为 h 的二叉树上的结点数至多为:20+21+2h-1=2h-1。,5.2.2 二叉树的性质,对于任何一棵二叉树,若其叶结点的个数为n0,度为2的结点个数为n2,则有n0=n2+1。,性质3:,则 二叉树上结点总数 n=?二叉树上分支总数 e=?,n
7、0+n1+n2,而 e与 n的关系如何?,证明:,n1+2n2,由此得,n0=n2+1。,设度为1的结点数为n1,e=n-1,5.2.2 二叉树的性质,度为m的树中,叶子结点数与其它结点数之间的关系如何?,思考,5.2.2 二叉树的性质,具有 n 个结点的完全二叉树的深度为 log2n+1 或 log2(n+1)。,性质4:,证明:,设完全二叉树的深度为 h,则根据第二条性质得,2h-1-1 n 2h-1,即2h-1 n 2h,h-1 log2 n h,因为 h 只能是整数,因此,,h=log2n+1,推出,5.2.2 二叉树的性质,性质5:,若对含 n 个结点的完全二叉树从上到下且从左至右进
8、行 0至 n-1 的编号,则对完全二叉树中任意一个编号为 i 的结点,有:(1)若 i=0,则该结点是二叉树的根,无双亲,否则,编号为(i-1)/2 的结点为其双亲结 点;(2)若 2i+1n,则该结点无左孩子,否则,编 号为 2i+1 的结点为其左孩子结点;(3)若 2i+2n,则该结点无右孩子结点,否 则,编号为2i+2 的结点为其右孩子结点。,5.2.1 二叉树的定义,5.2.2 二叉树的性质,5.2.3 二叉树的存储结构,5.2 二叉树的基本概念,5.2.3 二叉树的存储结构,2.二叉树的链式存储结构,1.二叉树的顺序存储结构,5.2.3 二叉树的存储结构顺序存储,用一组地址连续的存储
9、单元从根结点开始依次自上而下,并按层次从左到右存储完全二叉树上的各结点元素,即将完全二叉树编号为i的结点元素存储在下标为i数组元素中。,对于完全二叉树:,5.2.3 二叉树的存储结构顺序存储,例如(完全二叉树):,5.2.3 二叉树的存储结构顺序存储,先在树中增加一些并不存在的虚结点并使其成为一棵完全二叉树,然后用与完全二叉树相同的方法对结点进行编号,再将编号为i的结点的值存放到数组下标为i的数组单元中,虚结点不存放任何值。,对于非完全二叉树:,5.2.3 二叉树的存储结构顺序存储,例如(非完全二叉树):,问:一个深度为 k 且只有 k 个结点的右支树需要的数组存储单元为多少?,顺序存储仅适用
10、于满或完全二叉树。,5.2.3 二叉树的存储结构链式存储,1.二叉链表,2三叉链表,5.2.3 二叉树的存储结构二叉链表,root,结点结构:,5.2.3 二叉树的存储结构三叉链表,结点结构:,5.2.3 二叉树的存储结构二叉链表,二叉链表中结点类的描述(书中P156),public class BiTreeNode,/构造一个空结点 public BiTreeNode()this(null);,/构造一个左、右孩子域为空的结点public BiTreeNode(Object data)this(data,null,null);,private Object data;/结点的数据域priva
11、te BiTreeNode lchild,rchild;/左、右孩子域,5.2.3 二叉树的存储结构二叉链表,二叉链表中结点类的描述(书中P156),public class BiTreeNode,/构造一个数据域和左、右孩子域都不为空的结点public BiTreeNode(Object data,BiTreeNode lchild,BiTreeNode rchild)this.data=data;this.lchild=lchild;this.rchild=rchild;,5.2.3 二叉树的存储结构二叉链表,二叉链表存储结构下二叉树类的描述(书中P158),public class Bi
12、Tree,/构造一棵空树 public BiTree()this.root=null;,/构造一棵根结点为root的树public BiTree(BiTreeNode root)this.root=root;,private BiTreeNode root;/树的根结点,5.3.1 二叉树的遍历方法及其实现,5.3.2 二叉树遍历算法的应用举例,5.3.3 建立二叉树,5.3 二叉树的遍历,5.3.1 二叉树的遍历方法及其实现,一、问题的提出,二、二叉树遍历方法及其递归实现,三、二叉树遍历方法的非递归实现,5.3.1 二叉树的遍历方法及其实现,沿着某一条搜索路径对二叉树中的结点进行访问,使得每
13、个结点均被访问一次,而且仅被访问一次。,一、问题的提出,“访问”的含义可以很广,如:输出结点的信息等。,什么是遍历?,5.3.1 二叉树的遍历方法及其实现,一、问题的提出,“遍历”是任何类型均有的操作,对线性结构而言,只有一条搜索路径(因为每个结点均只有一个后继),故不需要另加讨论。而二叉树是非线性结构。,每个结点有两个后继,则存在如何遍历即按什么样的搜索路径遍历的问题。,5.3.1 二叉树的遍历方法及其实现,一、问题的提出,二、二叉树遍历方法及其递归实现,三、二叉树遍历方法的非递归实现,5.3.2 二叉树的遍历方法及其实现,二、二叉树的遍历方法及递归实现,对“二叉树”而言,可以有三条搜索路径
14、:,1先上后下的遍历;2先左后右的遍历;3先右后左的遍历。,5.3.1 二叉树的遍历方法及其实现,二叉树的遍历方法,对应三条搜索路径,“二叉树”有7种遍历方法:,1.层次遍历方法;,2.DLR(先根遍历);LDR(中根遍历);LRD(后根遍历)。,3.DRL;RDL;RLD。,5.3.1 二叉树的遍历方法及其实现,1.层次遍历,若二叉树为空,则为空操作;否则,按自上而下先访问第0层的根结点,然后再从左到右依次访问各层次中的每一个结点。,层次遍历序列:,ABECFDGHK,5.3.1 二叉树的遍历方法及其实现,2.先根(序)遍历(DLR)定义及递归实现,若二叉树为空树,则空操作;否则,(1)访问
15、根结点;(2)先根遍历左子树;(3)先根遍历右子树。,先根遍历序列:,ABCDEFGHK,先根遍历序列:,A B C D E F G H K,public void preRootTraverse(BiTreeNode T),先根遍历操作实现的递归算法描述:,5.3.1 二叉树的遍历方法及其实现,if(T!=null),System.out.print(T.getData();,preRootTraverse(T.getLchild();,preRootTraverse(T.getRchild();,5.3.1 二叉树的遍历方法及其实现,3.中根(序)遍历(LDR)定义及递归实现,若二叉树为空
16、树,则空操作;否则,(1)中根遍历左子树;(2)访问根结点;(3)中根遍历右子树。,动画播放(6-4-2-2),中根遍历序列:,BDCQEHGKF,中根遍历序列:,B D C A E H G K F,public void intRootTraverse(BiTreeNode T),中根遍历操作实现的递归算法描述:,5.3.1 二叉树的遍历方法及其实现,if(T!=null),System.out.print(T.getData();,intRootTraverse(T.getLchild();,intRootTraverse(T.getRchild();,5.3.1 二叉树的遍历方法及其实现
17、,4.后根(序)遍历(LRD)定义及递归实现,若二叉树为空树,则空操作;否则,(1)后根遍历左子树;(2)后根遍历右子树;(3)访问根结点。,动画播放(6-4-2-3),后根遍历序列:,DCBHKGFE,后根遍历序列:,D C B H K G F E A,public void postRootTraverse(BiTreeNode T),后根遍历操作实现的递归算法描述:,5.3.1 二叉树的遍历方法及其实现,if(T!=null),System.out.print(T.getData();,postRootTraverse(T.getLchild();,postRootTraverse(T.
18、getRchild();,5.3.1 二叉树的遍历方法及其实现,一、问题的提出,二、二叉树遍历方法及其递归实现,三、二叉树遍历方法的非递归实现,5.3.1 二叉树的遍历方法及其实现,1.先根遍历操作的非递归实现,方法:,借助一个栈来记载当前被访问结点的右孩子 结点。,主要思想:,从非空二叉树的根结点出发,沿着该结点的左子树向下搜索,在搜索过程中每遇到一个结点就先访问该结点,并将该结点的非空右孩子结点压栈。当左子树结点访问完成后,从栈顶弹出结点的右孩子结点,然后用上述同样的方法去遍历该结点的右子树,依此类推,直到二叉树中所有的结点都被访问为止。,5.3.1 二叉树的遍历方法及其实现,1.先根遍历
19、操作的非递归实现,基本步骤:,创建一个栈对象,根结点入栈;,当栈为非空时,将栈顶结点弹出栈内并访问该结点;,LinkStack S=new LinkStack();,T=(BiTreeNode)S.pop();,S.push(T);,System.out.print(T.getData();,5.3.1 二叉树的遍历方法及其实现,1.先根遍历操作的非递归实现,基本步骤:,对当前访问结点的非空左孩子结点相继依次访问,并将当前访问结点的非空右孩子结点压入栈内;,重复执行步骤和,直到栈为空为止。,While(T!=null),if(T.getLchild()!=null)System.out.pri
20、nt(T.getData();,if(T.getRchild()!=null)S.push(T.getRchild();,T=T.getLchild();,先根遍历的非递归算法(书P161算法5.4),LinkStack S=new LinkStack();,T=(BiTreeNode)S.pop();,S.push(T);,System.out.print(T.getData();,while(T!=null),if(T.getLchild()!=null)System.out.print(T.getData();,if(T.getRchild()!=null)S.push(T.getRch
21、ild();,T=T.getLchild();,while(!S.isEmpty(),public void preRootTraverse()BiTreeNode T=root;,if(T!=null),时间复杂度:O(n),5.3.1 二叉树的遍历方法及其实现,2.中根遍历操作的非递归实现,方法:,借助一个栈来记载遍历截长过程中所经历的而未被访问的所有结点,主要思想:,从非空二叉树的根结点出发,沿着该结点的左子树向下搜索,在搜索过程中将所遇到的每一个结点依次压栈,直到二叉树中最左下的结点压栈为止,然后从栈中弹出栈顶结点并对其进行访问,访问完后再进入该结点的右子树并用上述同样的方法去遍历该结
22、点的右子树,依此类推,直到二叉树中所有的结点都被访问为止。,5.3.1 二叉树的遍历方法及其实现,2.中根遍历操作的非递归实现,基本步骤:,创建一个栈对象,根结点入栈;,若栈顶结点非空,则将栈顶结点的非空左孩子相继进栈;,LinkStack S=new LinkStack();,while(S.peek()!=null),S.push(T);,S.push(BiTreeNode)S.peek().getLchild();,S.pop();/空结点出栈,5.3.1 二叉树的遍历方法及其实现,2.中根遍历操作的非递归实现,基本步骤:,栈顶结点出栈并访问非空栈顶结点,再 使该栈顶结点的非空右孩子结点
23、入栈;,重复执行步骤和,直到栈为空为止。,if(!S.isEmpty(),T=(BiTreeNode)S.pop();,System.out.print(T.getData();,S.push(T.getRchild();,中根遍历的非递归算法(书P162算法5.5),LinkStack S=new LinkStack();,S.push(T);,while(!S.isEmpty(),public void inRootTraverse()BiTreeNode T=root;,if(T!=null),while(S.peek()!=null),S.push(BiTreeNode)S.peek(
24、).getLchild();,S.pop();,if(!S.isEmpty(),T=(BiTreeNode)S.pop();,System.out.print(T.getData();,S.push(T.getRchild();,时间复杂度:O(n),5.3.1 二叉树的遍历方法及其实现,3.后根遍历操作的非递归实现,方法:,借助一个栈来记载遍历截长过程中所经历的而未被访问的所有结点;,引进一个访问标志变量flag和一个结点指针p。,其中:flag用来标记当前栈顶结点是否被访问,当值为true时,表示栈顶结点已被访问;当值为false时,表示当前栈顶结点未被访问,指针p指向当前遍历过程中最后一
25、个被访问的结点。,5.3.1 二叉树的遍历方法及其实现,3.后根遍历操作的非递归实现,基本步骤:,创建一个栈对象,根结点入栈,p赋初始值null;,若栈顶结点非空,则将栈顶结点的非空左孩子相继进栈;,LinkStack S=new LinkStack();,while(S.peek()!=null),S.push(T);,S.push(BiTreeNode)S.peek().getLchild();,S.pop();,BiTreeNOde p=null;,若栈非空,查看栈顶结点,若栈顶结点的右孩子为空,或者与p相等,则将栈顶结点弹出栈并访问它,同时使p指向该结点,并置flag值为true;否则
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 java
链接地址:https://www.31ppt.com/p-6119166.html