数据结构PPT教学课件-第六章 树和二叉树.ppt
《数据结构PPT教学课件-第六章 树和二叉树.ppt》由会员分享,可在线阅读,更多相关《数据结构PPT教学课件-第六章 树和二叉树.ppt(125页珍藏版)》请在三一办公上搜索。
1、第六章 树和二叉树,引言:,树型结构是一类重要的非线性结构。树型结构是结点之间有分支,且具有层次关系的结构,非常类似于自然界中的树。树结构在客观世界大量存在。例如家谱、行政组织机构都可用树形象地表示。树在计算机领域中也有着广泛的应用:在编译程序中,用树来表示源程序的语法结构;在数据库系统中,可用树来组织信息;Windows操作系统中对磁盘文件的管理。,南信大,叶子,根,子树,第六章 树和二叉树6.1 树的定义和基本术语6.2 二叉树6.3 遍历二叉树和线索二叉树6.4 树和森林6.5 哈夫曼树及应用,树的定义、术语、操作,二叉树定义、性质、操作,二叉树的存储结构(重点)顺序存储、链接存储,线索
2、二叉树(难点)(特殊的链接存储结构),二叉树运算,内容及重、难点,6.1,6.2,6.2,6.3,6.3,6.4,6.5,6.1 树的定义与术语,一、树的定义 树是由n(n 0)个结点组成的有限集合。如果n=0,称为空树;如果n 0,则:有一个特定的元素称之为根(root)的结点,除根以外的其他结点划分为m(m 0)个互不相交的有限集合T1,Tm,每个集合又是一棵树,并且称之为根的子树(subTree)。,根,子树,例:,1)树中只有根结点没有前趋;2)除根外,其余结点都有且仅一个前趋;3)树的结点,可以有零个或多个后继;4)除根外的其他结点,都存在唯一条从根到该结点的路径。,(非空)树结构特
3、点:,线性结构,树型结构,第一个数据元素(无前驱),根结点(无前驱),最后一个数据元素(无后继),多个叶子结点(无后继),其它数据元素(一个前驱、一个后继),其它数据元素(一个前驱、多个后继),(A(B(E(K,L),F),C(G),D(H(M),I,J)广义表,二、树的表示方法,凹入表,结点(node)结点的度(degree)结点的子树个数分支(branch)结点 度不为0的结点根(root)即根结点(没有前驱)叶(leaf)结点 度为0的结点孩子(child)结点 双亲(parent)结点 兄弟(sibling)结点 具有同一双亲的结点,三、树的基本术语,结点A的度:3结点B的度:2结点M
4、的度:0,分支结点:A,B,C,D,E,H叶结点:K,L,F,G,M,I,J,结点A的孩子:B,C,D结点B的孩子:E,F,结点I的双亲:D结点L的双亲:E,结点B,C,D为兄弟结点K,L为兄弟,祖先(ancestor)结点 结点的祖先是从根到该结点所经分支上的所有结点.子孙(descendant)结点 以某结点为根的子树中的任一结点都为该结点的子孙.结点的层次(level)根结点的层数为1,其余结点的层数为双亲结点的层数加1 树的高度(depth)树中结点的最大层数 树的度(degree),树的基本术语(续),结点K的祖先:A,B,E结点B的子孙:E,F,K,L,树的度:3,树的高度:4,结
5、点A的层次:1结点M的层次:4,有序树 子树的次序不能互换 无序树 子树的次序可以互换 森林(Forest)m棵互不相交的树的集合,基本术语(续):,树的运算分3大类:第一类:查找类遍历树中每个结点、求树的状态(如树高度、判树空)查找满足某种特定关系的结点,如查找根结点等第二类,插入类包括初始化空树、构造树、在树的当前结点上插入一个新结点等;第三类,删除类包括清空树、销毁树、删除树中结点。,四、树的基本操作(P118),五、树的抽象数据类型定义 ADT Tree数据对象D:由n个具有相同特性的元素构成的集合数据关系R:若D为空集,则称为空树。否则:(1)在D中存在唯一的称为根的数据元素root
6、;(2)当n1时,其余结点可分为m(m0)个互不相交的有限集T1,T2,Tm,其中每一棵子集本身又是一棵符合本定义的树,称为根root的子树.基本操作P:,Root(T)/求树的根结点,Value(T,cur_e)/求当前结点的元素值,Parent(T,cur_e)/求当前结点的双亲结点,LeftChild(T,cur_e)/求当前结点的最左孩子,CreateTree(&T,definition)/构造树,InitTree(&T)/初始化置空树,TreeEmpty(T)/判定树是否为空树,TreeDepth(T)/求树的深度,TraverseTree(T,Visit()/遍历,Assign(T
7、,cur_e,value)/给当前结点赋值,InsertChild(&T,&p,i,c)/将以c为根的树插入为结点p的第i棵子树,RightSibling(T,cur_e)/求当前结点的右兄弟,ClearTree(&T)/清空树,DestroyTree(&T)/销毁树,DeleteChild(&T,&p,i)/删除结点p的第i棵子树,ADT Tree,6.2 二叉树,6.2.1 二叉树的定义,二叉树或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。,A,B,C,D,E,F,G,H,K,根结点,左子树,右子树,说明(1)二叉树中每个结点最多有两棵子树;二叉树每个结
8、点度小于等于2;(2)左、右子树不能颠倒有序树;(3)二叉树是递归结构。,二叉树的五种基本形态,问题:1.只有两个结点的二叉树有几种不同的形态?,2.只有3个结点的二叉树有几种不同形态?分别画出来。,二叉树的基本操作,查找类,插入类,删除类,Root(T);Value(T,e);Parent(T,e);LeftChild(T,e);RightChild(T,e);LeftSibling(T,e);RightSibling(T,e);BiTreeEmpty(T);BiTreeDepth(T);PreOrderTraverse(T,Visit();InOrderTraverse(T,Visit()
9、;PostOrderTraverse(T,Visit();LevelOrderTraverse(T,Visit();,InitBiTree(,ClearBiTree(,性质1 若二叉树的层次从1开始,则在二叉树的第 i 层最多有 2i-1 个结点。(i 1)证明用数学归纳法,性质2 高度为 k 的二叉树最多有 2k-1个结点。(k 1)证明用求等比级数前k项和的公式 20+21+22+2k-1=2k-1,6.2.2 二叉树的性质,性质3 对任何一棵二叉树,如果其叶结点有 n0 个,度为2的非叶结点有 n2 个,则有 n0n21,证明:1、结点总数为度为0的结点加上度为1的结点再加上度为2的结点
10、:n=n0+n1+n22、另一方面,二叉树中1度结点有一个孩子,2 度结点有二个孩子,根结点不是任何结点的孩子,因此,结点总数为:n=n1+2n2+13、两式相减,得到:n0=n2+1,定义1 满二叉树(Full Binary Tree)一棵深度为k 且有2k-1个结点的二叉树。,定义2 完全二叉树(Complete Binary Tree)若设二叉树的高度为h,则共有h层。除第h层外,其它各层(1h-1)的结点数都达到最大个数,第h层从左向右连续有若干结点,这就是完全二叉树。,定义两种特殊的二叉树:,完全二叉树,完全二叉树的特点:(1)除最后一层外,每一层都取最大结点数,最后一层结点都有集中
11、在该层最左边的若干位置。(2)叶子结点只可能在层次最大的两层出现。(3)对任一结点,若其右分支下的子孙的最大层次为L,则其左分支下的子孙的最大层次为L或L+1。,满二叉树的特点:每一层都拥有最多结点数,思考:满二叉树与完全二叉树的有何异同点?满二叉树一定是一棵完全二叉树,反之完全二叉树不一定是一棵满二叉树。满二叉树的叶子结点全部在最底层,而完全二叉树的叶子结点可以分布在最下面两层。,性质4 具有n个结点的完全二叉树的高度 为+1。,证明:设深度为k,根据二叉树性质2知:2k-1-1n2k-1,即:2k-1 n 2k,于是有:,当i1,结点i为根结点,无双亲结点,否则其双亲为;若2in,结点i无
12、左子女;否则其左子女为2i;若2i1n,结点i无右子女;否则其右子女为2i1。,性质5 对具有n个结点的完全二叉树进行编号(按层次从左到右)编号可以反映二叉树结点之间的关系。,1,2,4,3,5,6,8,9,10,7,11,12,13,14,15,16,17,例:,i=8,其双亲为4号结点。i=18,则9号结点无左子女。i=14,则7号结点的左子女为14号结点。i=19,则9号结点无右子女。i=15,则7号结点的右子女为15号结点。,顺序存储结构链接存储结构二叉链表三叉链表,6.2.3 二叉树的存储,一、顺序存储结构 用一组连续的存储单元存储二叉树的结点数据。要求:必须把二叉树中的所有结点,按
13、照一定的次序排成为一个线性序列,结点在这个序列中的相互位置能反映出结点之间的逻辑关系。,二叉树的顺序存储示例:,对于完全二叉树,结点的层次序列反映了整个二叉树的结构。对于一般二叉树,则要通过添加虚结点将其扩充为完全二叉树。,二叉树的顺序存储示例:,思考:对如下一棵二叉树采用顺序存储结构,需要添加几个空结点?,小结:对于完全二叉树:结点编号完全可反映出该二叉树中结点之间的逻辑关系,可将此类二叉树中结点的编号与数组下标建立一一对应关系,所以采用顺序存储结构较好。对于一般的二叉树:需要添加“虚”结点,使之成为一棵完全二叉树,此时仍可用顺序存储结构表示这棵二叉树。但这样可能造成空间浪费,最坏情况是:深
14、度为k且只有k个结点的单支树,需要长度为2k1的空间。,二、二叉树的链式存储结构结点结构的设计二叉链表结点结构三叉链表结点结构,二叉链表,typedef struct BiTNode TElemType data;struct BiTNode*lchild,*rchild;/左右孩子指针 BiTNode,*BiTree;,在n个结点的二叉链表中,有n+1个空指针域,空指针个数:2*n0+1*n1+0*n2=2n0+n1=n0+n1+n0=n0+n1+n2+1=n+1,结点包含三个域:数据域、左指针域、右指针域,三叉链表,typedef struct BiTNode TElemType data
15、;struct BiTNode*lchild,*rchild,*parent;BiTNode,*BiTree;,结点包含四个域:数据域、双亲指针域、左指针域、右指针域,6.3 遍历二叉树和线索二叉树,遍历定义:指按照某种顺序访问二叉树中的每个结点,并且使每个结点被访问一次且仅一次。,6.3.1 遍历二叉树,遍历操作使非线性结构线性化。,遍历的顺序,T、L、R分别代表访问根结点、遍历左子树、遍历右子树遍历方式有6种:TLR、TRL、LTR、RTL、LRT、RLT。TLR(先序遍历);LTR(中序遍历);LRT(后序遍历);,按深度遍历,按广度遍历(层序遍历):从上到下、从左到右。,T L R,先
16、序遍历序列:A B D C,先序遍历:,先序遍历(T L R)若二叉树非空(1)访问根结点(2)先序遍历左子树(3)先序遍历右子树,L T R,中序遍历序列:B D A C,中序遍历(L T R)若二叉树非空(1)中序遍历左子树(2)访问根结点(3)中序遍历右子树,中序遍历:,L R T,后序遍历序列:D B C A,后序遍历(L R T)若二叉树非空(1)后序遍历左子树(2)后序遍历右子树(3)访问根结点,后序遍历:,先序:a*bc def,中序:ab*cdef,后序:abcd*ef,(一)二叉树遍历的递归算法,先序遍历的定义等价于:若二叉树为空,结束 基本项(终止条件)若二叉树非空 递归项
17、(1)访问根结点;(2)先序遍历左子树(3)先序遍历右子树;,1、先序遍历递归算法(采用二叉链表)Status PreOrderTraverse(BiTree T,Status(*visit)(TElemType e)/*功能:先序遍历二叉树;参数:T为二叉树的根,visit为对结点的处理方法*/if(T)/若根结点不空 if(visit(T-data)/访问根结点 if(PreOrderTraverse(T-lchild,visit)/先序遍历根的左子树 if(PreOrderTraverse(T-rchild,visit)/先序遍历根的右子树 return OK;,返回,返回,返回,返回,
18、A,C,B,D,返回,先序序列:A B D C,B,A,C,E,D,G,F,先序遍历序列:,A,B,D,E,G,C,F,A,B,D,E,G,C,F,2、中序遍历递归算法Status InOrderTraverse(BiTree T,Status(*visit)(TElemType e)/*功能:中序遍历二叉树;参数:T为二叉树的根,visit为对结点的处理方法*/if(T)/若根结点不空 if(InOrderTraverse(T-lchild,visit)/中序遍历根结点的左子树 if(visit(T-data)/访问根结点 if(InOrderTraverse(T-rchild,visit)
19、/中序遍历根结点的右子树 return OK;,3、后序遍历递归算法Status PostOrderTraverse(BiTree T,Status(*visit)(TElemType e)/*功能:后序遍历二叉树;参数:T为二叉树的根,visit为对结点的处理方法*/if(T)/若根结点不空 if(PostOrderTraverse(T-lchild,visit)/后序遍历根结点的左子树 if(PostOrderTraverse(T-rchild,visit)/后序遍历根结点的右子树 if(visit(T-data)/访问根结点 return OK;,(二)二叉树遍历的非递归算法 递归算法逻
20、辑清晰、易懂;但在实现时,由于函数调用栈层层叠加,效率不高,而采用非递归算法可提高效率。,T:A,T:B,T:E,T:G,栈在先序遍历中的作用,B,A,C,E,D,G,F,T,先序遍历序列:,A,B,D,E,G,栈用于存放已处理的根结点,以备在处理完该结点的左子树后再处理其右子树,前序遍历的非递归算法基本思路:1)、访问当前结点(初始时是根结点)2)、结点进栈,沿左指针查找左孩子。3)、若有左孩子,转第1步。4)、若无左孩子,判栈空?空则结束。非空,栈顶结点出栈,转向右子树,转第1步。,1、前序遍历的非递归算法,1、前序遍历的非递归算法 使用一个栈S,存放已处理的根结点,以备在处理完该结点的左
21、子树后再处理其右子树。初始,栈为空。Status PreOrderTraverse(BiTree T,Status(*visit)(TElemType e)/*功能:前序遍历二叉树;参数:T为二叉树的根,visit为对结点的处理方法*/P=T;InitStack(S);/初始化栈 while(p|(!StackEmpty(S)/二叉树未处理完 if(p)/当前未遇空结点 if(!visit(p-data)/访问当前子树根结点 return ERROR;/访问当前子树根结点时出错 push(S,p);/结点压栈 p=p-lchild;/继续向左子树前进 else pop(S,p);p=p-rch
22、ild;/弹出栈顶结点,处理其右子树 return OK;,处理的数据项 栈S中内容 p的指向,空 A,A A B,B AB C,C ABC,AB,A D,D AD,A E,E AE,A,空,p,B,A,C,E,D,G,F,T,T:A,T:B,T:E,T:G,栈在中序遍历中的作用,中序遍历序列:,D,B,G,栈用于保存当前结点的祖先结点,2、中序遍历的非递归算法Status InorderTraverse(BiTree T,Status(*visit)(TElemType e)InitStack(S);p=T;while(p|!StackEmpty(S)if(p)/未到达左子树末端 Push(
23、S,p);/当前结点压栈 p=p-lchild;/继续向左子树前进 else/已达到左子树末端 Pop(S,p);/弹出栈顶 if(!visit(p-data)return ERROR;/处理该结点 p=p-rchild;/向右子树前进 return OK;,分析:对左图所示的二叉树执行中序遍历的非递归算法,执行过程中栈、指针的变化情况.,3、后序遍历的非递归算法 遇到一个结点,将它压入栈中,然后去遍历它的左子树;遍历完左子树后,还不能立即访问该结点,而是要根据其右指针指示的结点去遍历该结点的右子树。遍历完右子树后才能从栈顶弹出该结点。为此,需给栈中每个元素加上一个特征位,以示区别:特征位为L
24、,表示已进入该结点的左子树,将从左边回来;特征位为R,表示已进入该结点的右子树,将从右边回来.,有关的说明:typedef enumL,R Tag;typedef struct BiTNode/二叉树结点类型定义 TElemType data;Tag tag;struct BiTNode*lchild,*rchild;BiTNode,*BiTree;,lchild data rchild Tag,后序遍历的非递归算法Status PostorderTraverse(BiTree T,Status(*visit)(TElemType e)if(T)InitStack(S);p=T;push(S,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构PPT教学课件-第六章 树和二叉树 数据结构 PPT 教学 课件 第六 二叉
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6417884.html