数据结构第4章树.ppt
《数据结构第4章树.ppt》由会员分享,可在线阅读,更多相关《数据结构第4章树.ppt(47页珍藏版)》请在三一办公上搜索。
1、教学目标1、知识目标1)掌握树的基本概念;2)掌握二叉树、满二叉树、完全二叉树的概念,掌握二叉树的性质;3)掌握二叉树的存储结构、二叉树的遍历及算法;4)了解树、森林与二叉树的转换及树的存储结构;5)掌握哈夫曼树的构造过程。2、能力目标1)具有恰当的选择二叉树作为数据的逻辑结构和存储结构的能力;2)具有应用二叉树解决实际问题的能力。3、素质目标养成良好的完成工作任务、团队合作、良好沟通、创新思维和解决问题的能力。,2,4.1 树的概念 树型结构是一类重要的非线性结构。树型结构是结点之间有分支,并具有层次关系的结构。它非常类似于自然界中的树。树结构在客观世界中是大量存在的,在计算机领域中也有着广
2、泛的应用,如在编译程序中,用树来表示源程序的语法结构;在数据库系统可用树来组织信息。1、树的递归定义:树是n(n0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:(1)有且仅有一个特定的称为根(Root)的结点;(2)其余的结点可分为m(m0)个互不相交的有限子集Tl,T2,Tm,其中每个子集本身又是一棵树,并称其为根的子树(Subtree)。注意:树的递归定义刻画了树的固有特性:一棵非空树是由若干棵子树构成的,而子树又可由若干棵更小的子树构成。,6,6,6,6,6,6,2、树的表示 1)树形图表示:结点用圆圈表示,结点名字写在圆圈旁或圆圈内,子树与其根之间用无向边来连接。2)嵌
3、套集合表示法:用集合的包含关系描述树结构。3)凹入表表示法:类似于书的目录。3、树结构的基本术语1)结点的度结点的度:一个结点拥有子树的个数称为该结点的度。树的度:该树中结点的最大度数称为该树的度。叶子结点:度为零的结点称为叶子或终端结点。分支结点:度不为零的结点称分支结点或非终端结点。即除叶子结点外的结点均为分支结点。内部结点:除根结点之外的分支结点统称为内部结点。开始结点:根结点又称为开始结点。,2)结点之间的关系孩子结点:树中某个结点的子树的根称为该结点的孩子结点。双亲结点:孩子结点的根称为该结点的双亲。兄弟结点:同一个双亲的孩子互称为兄弟结点。堂兄弟:在后面介绍。祖先和子孙:在后面介绍
4、。3)路径路径或道路:若树中存在一个结点序列k1,k2,kj,使得ki是ki+1的双亲(1ij),则称该结点序列是从kl到kj的一条路径或道路。路径的长度:指路径所经过的边的数目。注意:若一个结点序列是路径,则在树的树形图表示中,该结点序列自上而下地通过路径上的每条边。从树的根结点到树中其余结点均存在一条惟一的路径。,祖先和子孙:若树中结点k到ks存在一条路径,则称k是ks的祖先,ks是k的子孙。一个结点的祖先是从根结点到该结点路径上所经过的所有结点,而一个结点的子孙则是以该结点为根的子树中的所有结点。约定:结点k的祖先和子孙不包含结点k本身。4)结点的层数和树的深度 结点的层数:根结点的层数
5、为1,其余结点的层数等于其双亲结点的层数加1。堂兄弟:双亲在同一层的结点互为堂兄弟。树的深度:树中结点的最大层数称为树的深度。注意:也有将树根的层数定义为0的。5)有序树和无序树 若将树中每个结点的各子树看成是从左到右有次序的,则称该树为有序树;否则称为无序树。若不特别指明,一般讨论的树都是有序树。,6)森林 森林是m(m0)棵互不相交的树的集合。删去一棵树的根,就得到一个森林;反之,加上一个结点作树根,森林就变为一棵树。4、树型结构的逻辑特征 树型结构的逻辑特征可用树中结点之间的父子关系来描述:1)树中任一结点都可以有零个或多个直接后继结点,但至多只能有一个直接前驱结点。2)树中只有根结点无
6、前驱,它是开始结点;叶结点无后继,它们是终端结点。3)祖先与子孙的关系是对父子关系的延拓,它定义了树中结点之间的纵向次序。4)有序树中,同一组兄弟结点从左到右有长幼之分。对这一关系加以延拓,规定若k1和k2是兄弟,且k1在k2的左边,则kl的任一子孙都在k2的任一子孙的左边,那么就定义了树中结点之间的横向次序。,4.2 二叉树 二叉树是树型结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。一、二叉树的定义 1、二叉树的递归
7、定义 二叉树是n(n0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。2、二叉树的五种基本形态 二叉树可以是空集;可以有空的左子树或右子树;或者左、右子树皆为空。二叉树的五种基本形态如图所示。,3、二叉树不是树的特例 1)二叉树与无序树不同 无序树中每个结点可以有多棵子树,即使只有两棵子树也无左右之分;二叉树中,每个结点最多只能有两棵子树,并且有左右之分。2)二叉树与度数为2的有序树不同 在有序树中,虽然一个结点的孩子之间是有左右次序的,但是若该结点只有一个孩子,就无须区分其左右次序;而在二叉树中,即使是一个孩子也有左右之
8、分。例 下图中(a)和(b)是两棵不同的二叉树,它们同右图中的普通树(作为有序树或无序树)很相似,但却不等同于这棵普通树。若将这三棵树均看做普通树,则它们就是相同的了。二叉树并非是树的特殊情形,它们是两种不同的数据结构。,二、二叉树的性质性质1 二叉树第i层上的结点数目最多为2i-1(i1)个。性质1的证明可采用数学归纳法。性质2 深度为k的二叉树至多有2k-1(k1)个结点。性质2由性质1可以得到。性质3 在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。两种特殊的二叉树1、满二叉树:一棵深度为k且有2k-1个结点的二叉树称为满二叉树。满二叉树的特点:每一层
9、上的结点数都达到最大值。即对给定的高度,它是具有最多结点数的二叉树。满二叉树中不存在度数为1的结点,每个分支结点均有两棵高度相同的子树,且树叶都在最下一层。,12,证明:假设树非空,用数学归纳法证明:当i=1时,因为第1层上只有一个根结点,而2i-1=20=1。所以命题成立。假设对所有的j(1ji)命题成立,即第j层上至多有2j-1个结点,证明j=i时命题亦成立。根据归纳假设,第i-1层上至多有2i-2个结点。由于二叉树的每个结点至多有两个孩子,故第i层上的结点数至多是第i-1层上的最大结点数的2倍。即j=i时,该层上至多有22i-2=2i-1个结点,故命题成立。,12,证明:因为二叉树中所有
10、结点的度数均不大于2,所以结点总数(记为n)应等于0度结点数、1度结点和2度结点数(分别记为n0,n1,n2)之和:n=n0+n1+n2 另一方面,1度结点有一个孩子,2度结点有两个孩子,故二叉树中孩子结点总数是:nl+2n2,而树中只有根结点不是任何结点的孩子,故二叉树中的结点总数又可表示为:n=n1+2n2+1 综合以上两个式子得到:n0=n2+1 即在二叉树中叶子结点数比度为2的结点数多1个。,证明:由性质1,第i层至多有2i-1个(1ik)结点,所以深度为k的二叉树的结点总数至多为 20+21+2k-1=2k-1个。,12,13,2、完全二叉树 若一棵二叉树至多只有最下面的两层上结点的
11、度数可以小于2,并且最下一层上的结点都集中在该层最左边的若干位置上,则此二叉树称为完全二叉树。完全二叉树特点:1)满二叉树是完全二叉树,完全二叉树不一定是满二叉树。2)在满二叉树的最下一层上,从最右边开始连续删去若干结点后得到的二叉树是一棵完全二叉树。3)在完全二叉树中,若某个结点没有左孩子,则它一定没有右孩子,即该结点必是叶结点。4)深度为k的完全二叉树的前k-1层是深度为k-1的满二叉树,一共有2k-1-1个结点。性质4 具有n个结点的完全二叉树的深度为lgn+1或lg(n+1),其中方括号表示取整数部分。,证明:设所求完全二叉树的深度为k。由完全二叉树特点知:深度为k的完全二叉树的前k-
12、1层是深度为k-1的满二叉树,一共有2k-1-1个结点。由于完全二叉树深度为k,故第k层上还有若干个结点,因此该完全二叉树的结点个数n2k-1-1。另一方面,由性质2知:深度为k的二叉树至多有2k-1(k1)个结点,因此,n2k-1,即:2k-1-ln2k-1,由此可推出:2k-1n2k,取对数后有:k-1lgnk 又因k-1和k是相邻的两个整数,故有k-1=lgn 由此即得:k=lgn+1。另外,由2k-1-ln2k-1得2k-1n+12k,两边再取对数便可得到:k=lg(n+1)。,三、二叉树的存储结构1、顺序存储结构:把二叉树所有结点按照一定的线性次序存储到一片连续存储单元中。结点在这个
13、序列中的相互位置还能反映出结点之间的逻辑关系。(1)完全二叉树的存储结构完全二叉树结点的编号编号方法:在一棵n个结点的完全二叉树中,从树根起,自上层到下层,每层从左至右给所有结点编号,开始结点的编号为1,这样能得到一个反映整个二叉树结构的线性序列。编号特点:完全二叉树中除最下面一层外,各层都充满了结点。每一层的结点个数恰好是上一层结点个数的2倍。从一个结点的编号就可推得其双亲,左、右孩子,兄弟等结点的编号。假设编号为i的结点是ki(1in),则有:,若i1,则ki的双亲编号为i/2;若i=1,则ki是根结点,无双亲。若2in,则ki的左孩子的编号是2i;若2in,则ki无左孩子,因此也无右孩子
14、,即ki必定是叶子。因此完全二叉树中编号in/2的结点必定是叶结点。若i为奇数且不为1,则ki是结点ki/2的右孩子,ki的左兄弟的编号是i-1;若i=1或i为偶数,则ki无左兄弟。若i为偶数且小于n,则ki是结点ki/2的左孩子,ki的右兄弟的编号是i+1;若i=n或i为奇数,则ki无右兄弟。由此可知,完全二叉树中结点的编号序列,完全反映了结点之间的逻辑关系。,完全二叉树的顺序存储 将完全二叉树中所有结点按编号顺序依次存储在一个向量bt0n中。其中:bt1n用来存储结点,bt0不用或用来存储结点数目。说明:完全二叉树的顺序存储结构既简单又节省存储空间;按这种方法存储的完全二叉树,向量元素bt
15、i的下标i就是对应结点的编号。(2)一般二叉树的顺序存储具体方法将一般二叉树添上一些“虚结点”,使其成为完全二叉树;为了用结点在向量中的相对位置来表示结点之间的逻辑关系,按完全二叉树形式给结点编号;将结点按编号存入向量对应分量,其中“虚结点”用表示。,例如:设完全二叉树共有26个结点,存放在向量bt026中。则bt15的双亲结点是bt7;bt15是bt7的右孩子;bt15的左兄弟是bt14;bt15无孩子结点,是叶结点。,二叉树的顺序存储结构的优缺点:优点是存储结构简单;缺点是可能浪费大量的存储空间。在最坏的情况下,一个深度为k的且只有k个结点的右单支树,需要2k-1个结点的存储空间,浪费了2
16、k-1-k个存储空间。例如:三个结点的右单支树。二叉树顺序存储结构的描述#define MAXSIZE 50/设置二叉树的最大结点数typedef char DataType;/定义结点类型typedef struct/定义二叉树结构 DataType btMAXSIZE;/存放二叉树的结点 int num;/存放二叉树的结点数 SeqBT;注:如果使用元素bt0存放二叉树的结点数,成员num可省略或不定义结构而只定义数组。,2、链式存储结构(1)结点的结构:二叉树的每个结点最多有两个孩子。用链接方式存储二叉树时,每个结点除了存储结点本身的数据外,还应设置两个指针域lchild和rchild,
17、分别指向该结点的左孩子和右孩子。结点的结构如图:(2)结点的类型说明typedef char DataType;/定义结点数据域类型typedef struct node/定义结点结构 DataType data;struct node*lchild,*rchild;/左右孩子指针 BinTNode;/结点类型 typedef BinTNode*BinTree;/*定义新类型BinTree为指向BinTNode类型结点的指针类型,用于定义指向根结点的指针*/,(3)二叉链表(二叉树的常用链式存储结构)在一棵二叉树中,所有类型为BinTNode的结点,再加上一个指向开始结点(即根结点)的BinT
18、ree型头指针(即根指针)root,就构成了二叉树的链式存储结构,并将其称为二叉链表。说明:一个二叉链表由根指针root惟一确定。若二叉树为空,则root=NULL;若结点的某个孩子不存在,则相应的指针为空。具有n个结点的二叉链表中,共有2n个指针域。其中只有n-1个用来指示结点的左、右孩子,其余的n+1个指针域为空。(4)带双亲指针的二叉链表 经常要在二叉树中寻找某结点的双亲时,可在每个结点上再加一个指向其双亲的指针parent,形成一个带双亲指针的二叉链表。,证明:因为二叉树中结点总数n等于0度结点数n0、1度结点数n1和2度结点数n2之和:n=n0+n1+n2 由二叉树的性质3:n0=n
19、2+1,所以,n1+2n2=n-1。而在二叉链表中,度为1的结点有一个指针域不空,度为2的结点的两个指针域都不空,即n个结点的二叉链表中共有n1+2n2个指针域不空,即n-1个指针域不空,分别指向左右孩子。因此,其余的n+1个指针域为空。,19,4.3 二叉树的遍历 二叉树遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。遍历:是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。一、遍历方案1、遍历方案:由于二叉树中每个结点可能有两个后继结点,所以遍历二叉树存在多条遍历路线。从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右
20、子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:1)访问结点本身(N);2)遍历该结点的左子树(L);3)遍历该结点的右子树(R)。以上三种操作有六种遍历方案:NLR、LNR、LRN、NRL、RNL、RLN。由于前三种次序与后三种次序对称,所以只讨论先左后右的前三种次序。,2、三种遍历的命名前(先)序遍历NLR:访问结点的操作发生在遍历其左右子树之前,又称为先根遍历。中序遍历LNR:访问结点的操作发生在遍历其左右子树之中(间),又称为中根遍历。后序遍历LRN:访问结点的操作发生在遍历其左右子树之后,又称为后根遍历。3、遍历规则及算法(1)中序遍历的递归算法 若二叉树
21、非空,则依次执行如下操作:遍历左子树;访问根结点;遍历右子树。(2)先序遍历的递归算法 若二叉树非空,则依次执行如下操作:访问根结点;遍历左子树;遍历右子树。(3)后序遍历得递归算法 若二叉树非空,则依次执行如下操作:遍历左子树;遍历右子树;访问根结点。,/*用二叉链表作为存储结构的中序遍历算法*/void InOrder(BinTree T)if(T)/如果二叉树非空 InOrder(T-lchild);/遍历左子树 printf(c,T-data);/访问根结点 InOrder(T-rchild);/遍历右子树,/*用二叉链表作为存储结构的先序遍历算法*/void PreOrder(Bin
22、Tree T)if(T)/如果二叉树非空 printf(c,T-data);/访问根结点 PreOrder(T-lchild);/遍历左子树 PreOrder(T-rchild);/遍历右子树,/*用二叉链表作为存储结构的后序遍历算法*/void PostOrder(BinTree T)if(T)/如果二叉树非空 PostOrder(T-lchild);/遍历左子树 PostOrder(T-rchild);/遍历右子树 printf(c,T-data);/访问根结点,21,21,22,二、遍历序列1、中序序列:中序遍历二叉树时,按对结点的访问次序形成的结点序列称为中序序列。2、先序序列:先序遍
23、历二叉树时,按对结点的访问次序形成的结点序列称为先序序列。3、后序序列:后序遍历二叉树时,按对结点的访问次序形成的结点序列称为后序序列。三、二叉链表的构造1、基本思想 基于先序遍历构造二叉链表,即以二叉树的先序序列为输入构造二叉链表。注:先序序列中须加入虚结点以示空指针的位置。如:前例右图带虚结点的先序序列为:ABDGCEHF。2、构造算法,/*以二叉树的先序序列为输入构造二叉链表*/*假设虚结点输入时以空格字符表示*/void CreateBinTree(BinTree*T)/构造二叉链表。T是指向根指针的指针char ch;if(ch=getchar()=)*T=NULL;/读入空格,将相
24、应指针置空else/读入非空格*T=(BinTNode*)malloc(sizeof(BinTNode);(*T)-data=ch;CreateBinTree(/构造右子树注意:调用该算法时,应将待建立的二叉链表的根指针的地址作为实参。,四、二叉链表的基本操作二叉树的基本操作包括:遍历二叉树、计算二叉树深度、计算所有结点总数、计算叶子结点数、计算双孩子结点个数、计算单孩子结点个数等。说明:以下操作均用二叉链表作为存储结构。1、计算二叉树深度算法步骤:如果二叉树BT为空,返回0,否则执行;分别计算BT的左右子树的深度;如果左子树深度大,返回左子树深度+1,否则返回右子树深度+1。2、计算双孩子结
25、点个数算法步骤:如果二叉树BT为空,返回0;如果左右子树至少有一个为空,返回左子树双孩子结点数与右子树双孩子结点数之和;如果左右子树都不空,返回左子树双孩子结点数与右子树双孩子结点数之和+1。,/*二叉链表作为存储结构计算二叉树深度算法*/int BinTreeDepth(BinTNode*BT)int leftdep,rightdep;/分别记录左右子树深度 if(BT=NULL)return(0);else leftdep=BinTreeDepth(BT-lchild);rightdep=BinTreeDepth(BT-rchild);if(leftdeprightdep)return(l
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 章树
链接地址:https://www.31ppt.com/p-6578919.html