第六章树和二叉树.ppt
《第六章树和二叉树.ppt》由会员分享,可在线阅读,更多相关《第六章树和二叉树.ppt(107页珍藏版)》请在三一办公上搜索。
1、数据结构,主讲教师:杨艳霞时间:20102011学年下,第六章 树和二叉树,概述,树型结构是一类重要的非线性结构树是以分支关系定义的层次结构树的应用人类社会的族谱社会组织结构在编译程序中的语法树在数据库系统中,可用树来组织信息,树型结构实例,1家族树,math,ds,zhao,jiang,shao,li,queue,tree,graph,stack,sw,root,bin,lib,user,etc,【2】磁盘目录结构和文件管理系统,内 容,6.1 树的定义和基本术语,1,6.3 遍历二叉树和线索二叉树,2,6.4 树和森林,3,4,6.6 哈夫曼树及其应用,5,6.2 二叉树,6.1 树的定义
2、和基本术语,1.树的一般定义,树(Tree)是n(n=0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:有且仅有一个结点没有前驱,称该结点为根结点(Root);除根结点以外,其余结点可分为m(m0)个互不相交的有限集合T0,Tl,Tm-1。其中每个集合又构成一棵树,树T0,Tl,Tm-1被称为根结点的子树(Subtree)。每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个后继。,例子,A,根,子树,说明,树的结构定义是一个递归定义,即在树的定义中有用到了树的概念,递归是树的固有特性。其它表示形式(含有递归特性):嵌套集合形式广义表形式凹入表示法,2.树的基本术语,树的结点
3、:包含一个数据元素和指向其子树的所有分支;结点的度:一个结点拥有的子树个数,度为零的结点称为叶结点;树的度:树中所有结点的度的最大值 Max(D(I)含义:树中最大分支数为树的度;,结点的层次及树的深度:根为第一层,根的孩子为第二层,若某结点为第k层,则其孩子为k+1层.树中结点的最大层次称为树的深度或高度.森林:是m(m=0)棵互不相交的树的集合.序树、无序树:如果树中每棵子树从左向右的排列拥有一定的顺序,不得互换,则称为有序树,否则称为无序树。,孩子、双亲:结点子树的根称为这个结点的孩子,而这个结点又被称为孩子的双亲。子孙:以某结点为根的子树中的所有结点都被称为是该结点的子孙。祖先:从根结
4、点到该结点路径上的所有结点。兄弟:同一个双亲的孩子之间互为兄弟。堂兄弟:双亲在同一层的结点互为堂兄弟。,结点A的度:3结点B的度:2结点M的度:0,叶子:K,L,F,G,M,I,J,结点A的孩子:B,C,D结点B的孩子:E,F,结点I的双亲:D结点L的双亲:E,结点B,C,D为兄弟结点K,L为兄弟,树的度:3,结点A的层次:1结点M的层次:4,树的深度:4,结点F,G为堂兄弟结点A是结点F,G的祖先,2、基本术语,6.2 二叉树的相关概念,二叉树在树结构的应用中起着非常重要的作用,因为对二叉树的许多操作算法简单;而任何树都可以与二叉树相互转换,这样就解决了树的存储结构及其运算中存在的复杂性。,
5、1.二叉树的定义,二叉树是由 n(n=0)个结点的有限集合构成;此集合或者为空集(空树);或者由一个根结点及两棵互不相交的左子树和右子树组成(左、右子树可以为空),并且左右子树都是二叉树。,这也是一个递归定义。二叉树可以是空集合,根可以有空的左子树或空的右子树。,实例,说明,二叉树和树的区别二叉树是有序树,其子树要区分左子树和右子树,即使只有一棵子树也要进行区分,说明它是左子树,还是右子树。而树一般是指无序树。二叉树的五种基本形态,二叉树的五种基本形态,空二叉树 仅有根结点的二叉树 左右子树均非空的二叉树 右子树为空的二叉树 左子树为空的二叉树,2.二叉树的性质,性质1:在二叉树的第i层上至多
6、有2i-1个结点(i=1),性质2:深度为k的二叉树至多有2k1个结点。,证明(数学归纳法):(1)当i=1时,只有一个根结点,2i-1=20=1,命题成立。(2)假定对于i-1(i=2)时,命题成立,则第i1层上至多有2i-2个结点。(3)对于第 i 层而言,由于二叉树每个结点的度最大为2,故在第 i 层上最 大结点数为第i1层上最大结点数的二倍,即22i-2 2i-1。,由性质1可知,深度为k的二叉树的最大结点数为:,性质3:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0n21。,证明:假设二叉树中总的结点数为 n,度为0的结点数为 n0,度为1的结点数为 n1,
7、度为2的结点数为 n2;则有 n n0n1n2。又根据二叉树中的分支数:设B为二叉树中的分支总数。则除根结点外,其余结点都有一个进入分支,则有:n B1。而这些分支都是由度为1和2的结点射出的,故又有:B n1+2*n2。即,nB1n12n21。则有n=n0+n1+n2=n1+2*n2+1,故n0n21。,满二叉树和完全二叉树,满二叉树是深度为k,且有 2k-1 个结点的二叉树。即,满二叉树的每一层上的结点数都是最大结点数。对满二叉树编号:从根结点开始,从上到下,从左至右。,完全二叉树:深度为k且有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之
8、为完全二叉树。,特点,叶子结点只可能在层次最大的两层上出现;对任一结点,若其右分支下的子孙的最大层次为l,则其左分支下的子孙的最大层次必为l 和 l+1。在满二叉树的最下一层上,从最右边开始连续删除去若干个结点得到的二叉树任然是一棵完全树。,实例,证明:假设深度为k,则根据性质2和完全二叉树的定义有:2k-11n2k-1,或 2k-1 n 2k-1,则有:k-1 log2n k。由于k是整数,则有k=,性质4:具有n个结点的完全二叉树的深度为,性质5 在按层序编号的n个结点的完全二叉树中,任意一结点 i(1in)有:,(1)i=1时,结点i是树的根;否则,结点i的双亲为结点 i/2(i1)。,
9、(2)2in时,结点i无左孩子,为叶结点;否则,结点i的左孩子为结点2i。,(3)2i+1n时,结点i无右孩子;否则,结点i的右孩子为结点2i+1。,3.二叉树的存储结构,顺序存储结构链式存储结构二叉链表三叉链表线索链表,二叉树的顺序存储结构,/=二叉树的顺序存储表示=#define MAX_TREE_SIZE 100 typedef TElemType SqBiTree MAX_TREE_SIZE;/0号单元存储根结点SqBiTree bt;,说明,顺序存储结构是用一组连续的存储单元存储二叉树的数据元素,即要把二叉树这种非线性结构的结点安排成为一个线性的序列,且二叉树结点在这个线性序列中的相
10、互位置能反映出二叉树结点之间的逻辑关系。约定:按照完全二叉树上的编号 i的结点元素存储在如上定义的一维数组中下标为 i-1 的分量中。而对于一般的二叉树,则应将其每个结点与完全二叉树上的结点相对照,存储在一维数组的相应分量中;对于不存的结点,以“0”表示。,例子,顺序存储结构的缺点,很可能对存储空间造成极大的浪费。在最坏的情况下,一个深度为k且只有k个结点的右单支树,需要2k-1个结点存储空间。若经常需要插入与删除树中结点时,顺序存储方式不是很好!,二叉链表和三叉链表,二叉链表,头指针指向根结点,说明:,一个二叉链表由根指针root唯一确定。若二叉树为空,则root=NULL;若结点的某个孩子
11、不存在,则相应的指针为空。具有n个结点的二叉链表中,共有2n个指针域。其中只有n-1个用来指示结点的左、右孩子,其余的n+1个指针域为空。,三叉链表,头指针指向根结点,/=二叉链表的存储表=typedef struct BiTNode TElemType data;struct BiTNode*lchild,*rchild;/左右孩子指针 BiTNode,*BiTree;,/=基本操作的原型=Status CreateBiTree(BiTree,6.3 遍历二叉树和线索二叉树,1.遍历二叉树的含义,遍历二叉树,就是按某条搜索路径访问树中的每一个结点,使得每一个结点均被访问一次,而且仅被访问一次
12、。遍历运算对线性结构是容易解决的,而对于二叉树这样的非线性结构,则需要寻找某种规律,以使二叉树上的结点能排列在一个线性队列上,从而便于遍历。因此,二叉树遍历的问题的本质,就是如何将二叉树的非线性结构按照一定的规则排列成为线性结构。,由二叉树的递归定义,二叉树的三个基本组成单元是:根结点、左子树和右子树。,寻找规律,假如以L、D、R分别表示遍历左子树、遍历根结点和遍历右子树,遍历整个二叉树则有DLR、LDR、LRD、DRL、RDL、RLD六种遍历方案。若规定先左后右,则只有前三种情况:(1)DLR先(根)序遍历;(2)LDR中(根)序遍历;(3)LRD后(根)序遍历。,先根遍历操作,若二叉树为空
13、,则空操作;否则访问根结点;先序遍历左子树;先序遍历右子树。,中根遍历操作,若二叉树为空,则空操作;否则中序遍历左子树;访问根结点;中序遍历右子树。,后根遍历操作,若二叉树为空,则空操作;否则后序遍历左子树;后序遍历右子树;访问根结点。,例子,表达式:a+b*(c-d)-e/f,先序:-+a*b c d/e f,中序:a+b*c d-e/f,后序:a b c d-*+e f/-,这三个式子分别为表达式的前缀表示(波兰式)、中缀表示和后缀表示(逆波兰式)。,先序遍历二叉树的递归算法,Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType
14、 e)/先序遍历二叉树T的递归算法,采用二叉链表存储结构。/对其中的每个元素调用函数Visit。/最简单的Visit函数是:/Status PrintElement(TElemType e)/输出元素e的值/printf(e);/return OK;/调用实例:PreOrderTraverse(T,PrintElement);1.if(T)2.if(Visit(T-data)3.if(PreOrderTraverse(T-lchild,Visit)4.if(PreOrderTraverse(T-rchild,Visit)5.return Ok;6.return ERROR;/在Visit函数失
15、败的情况下,才会执行此语句。7.else return OK;8.,D L R,先序遍历序列:A B D C,先序遍历:,先序遍历,若二叉树为空树,则空操作;否则,,中序遍历算法,(1)中序遍历左子树;,(2)访问根结点;,(3)中序遍历右子树。,void Inorder(BiTree T,void(*visit)(BiTree)/中序遍历以T为根指针的二叉树 if(T)/T=NULL时,二叉树为空树,不做任何操作Inorder(T-lchild,visit);/中序遍历左子树 visit(T);/通过函数指针*visit 访问根结点 Inorder(T-rchild,visit);/中序遍历
16、右子树/if,L D R,中序遍历序列:B D A C,中序遍历,中序遍历算法,后序遍历算法,若二叉树为空树,则空操作;否则,,(1)后序遍历左子树;,(2)后序遍历右子树;,(3)访问根结点。,void Postorder(BiTree T,void(*visit)(BiTree)/后序遍历以T为根指针的二叉树 if(T)/T=NULL时,二叉树为空树,不做任何操作Postorder(T-lchild,visit);/后序遍历左子树 Postorder(T-rchild,visit);/后序遍历右子树 visit(T);/通过函数指针*visit 访问根结点/if,L R D,后序遍历序列:
17、D B C A,后序遍历:,后序遍历算法,所谓二叉树的层次遍历,是指从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。,层次遍历,作业:查资料写出层次遍历的算法.,例如:,先序序列:,中序序列:,后序序列:,A B C D E F G H K,B D C A E H G K F,D C B H K G F E A,层次序列:,A B E C F D G H K,总结:“遍历”是二叉树各种操作的基础,可以在遍历过程中对结点进行各种操作。如:对于一棵已知树可求结点的双亲,求结点的孩子结点,判定结点所在层次等;反之,也可以在遍历过程中生成结点,建立二叉树
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六章 树和二叉树 第六 二叉
链接地址:https://www.31ppt.com/p-4984493.html