《数据结构实用教程(C语言版)》第5章树.ppt
《《数据结构实用教程(C语言版)》第5章树.ppt》由会员分享,可在线阅读,更多相关《《数据结构实用教程(C语言版)》第5章树.ppt(84页珍藏版)》请在三一办公上搜索。
1、,数据结构实用教程(C语言版)中国水利水电出版社,第5章 树,本章中主要介绍下列内容:树的逻辑定义和存储结构二叉树的逻辑定义、存储结构二叉树的基本操作算法树和二叉树的转换哈夫曼树及其应用,本章目录,结束,5.1 树,5.1.1 树的定义5.1.2 树的表示方法5.1.3 树的基本术语5.1.4 树的存储结构,返回到总目录,5.1.1 树的定义,树是n(n0)个结点的有限集合。当n=0时称为空树。当n0时,是非空树,它满足以下两个条件:(1)有且仅有一个称为根的结点;(2)其余结点分为m(m0)个互不相交的非空集合T1,T2,Tm,其中每个集合本身又是一棵树,称为根的子树。,返回到本节目录,树的
2、二元组表示法,树可用二元组来表示。其中,D为结点集合,R为边的集合。一棵树T如图5-1所示,则它的二元组表示方法为:T=(D,R)D=A,B,C,D,E,F,G,HR=,图5-1 树的逻辑结构图,返回到本节目录,树的表示方法,树的逻辑结构表示有树形表示法,文氏图表示法,凹入表示法和广义表表示法等。1树形表示法这是树的最基本的表示,使用一棵倒置的树表示树结构。图5-1就是采用这种方法。2文氏表示法使用集合以及集合的包含关系描述树结构。图5-2(a)就是图5-1的树的文氏图表示法。3凹入表示法使用线段的伸缩关系描述树的结构。图5-2(b)就是图5-1的树的凹入表示法。4广义表表示法将树的根结点写在
3、括号的左边,除根结点外的其余结点写在括号内并用逗号间隔来描述树的结构。图5-2(c)就是图5-1的树的广义表表示法。,返回到本节目录,树的三种表示方法,(a)文氏图表示法(b)凹入图表示法(c)广义表表示法图5-2 树的其它表示方法,返回到本节目录,树的基本术语,1结点 树的结点包含一个数据元素及若干指向其子树的分支。2结点的度 结点所拥有的分支数目或后继结点个数称为该结点的度(Degree)。例如图5-1所示的树中结点A的度为3,结点C的度为2,结点E的度为0。3树的度 树中各结点度的最大值称为该树的度。例如图5-1所示的树的度为3。4叶子(终端结点)度为零的结点称为叶子结点。例如图5-1所
4、示的树中结点E、G、H、I为叶子结点。,返回到本节目录,树的基本术语,5分支结点 度不为零的结点称为分支结点。例如图5-1所示的树中的A、B、C、D、F都是分支结点。6孩子结点 一个结点的后继称为该结点的孩子结点。例如图5-1所示的树中A的孩子结点为B、C、D。7双亲结点 一个结点称其为其后继结点的双亲结点。例如图5-1所示的树中A是B、C、D的双亲结点,C是F、G的双亲。8兄弟结点 同一双亲结点下的孩子结点互称为兄弟结点。例如图5-1所示的树中B、C、D互为兄弟结点,F、G互为兄弟结点,但不同双亲的两个同层结点不互为兄弟结点,如G和H不互为兄弟结点。,返回到本节目录,树的基本术语,9堂兄弟
5、双亲互为兄弟的两个结点互称为堂兄弟。例如图5-1所示的树中G和H就互为堂兄弟。10子孙结点 一个结点的所有子树中的结点称之为该结点的子孙结点。例如图5-1所示的树中A的子孙为B、C、D、E、F、G、H、I。11祖先结点 从树根结点到达一个结点的路径上的所有结点称为该结点的祖先结点。例如图5-1所示的树中E的祖先结点为A和B(包括其双亲结点B)。,返回到本节目录,树的基本术语,12层数树的根结点的层数为1,其余结点的层数等于它双亲结点的层数加1。例如图5-1所示的树中A的层数为1,B、C、D的层数为2,E、F、G、H的层数为3,I的层数为4。13树的深度树中结点的最大层数称为树的深度(或高度)。
6、例如图5-1所示的树中的深度为4。14有序树和无序树如果一棵树中的结点的各子树从左到右是有次序的,即若交换了某结点各子树的相对位置,则构成了不同的树,称这样的树为有序树,反之,则为无序树。15森林m(m0)棵互不相交树的集合称为森林。,返回到本节目录,5.1.4 树的存储结构,1.双亲表示法 用一个一维数组存储树中的各个结点,数组元素是一个结构体型数据,包含两个域:data域和parent域,分别表示结点的数据值和其双亲结点在数组中的下标。其类型定义如下:typedef struct ElemType data;/*结点的数据域,ElemType可以是任意类型*/int parent;/*结点
7、存储其双亲的数组下标值*/ParTypeMaxSize;,返回到本节目录,1.双亲表示法示例,图5-1中给出的树,可以用图5-3来存储表示。其中,规定数组下标为0的位置存储的是根结点,设根结点的parent域为-1。,图5-3 图5-1中树的双亲表示法,返回到本节目录,5.1.4 树的存储结构,2.孩子表示法将每个结点的孩子结点构成一个单链表,称之为孩子链表。n个结点的树有n个这样的孩子链表。为了方便起见,我们将每个结点存放在一个顺序表中,顺序表的每个元素有两个域:一个是存放该结点的数据值;另一个是存放该结点的第一个孩子的地址。孩子结点也有两个域:一个域是存放该孩子结点在顺序表中的位置(数组下
8、标),另一个域是存放下一个孩子的地址。,返回到本节目录,2.孩子表示法举例,图5-4是图5-1所示树的孩子表示法。其中,规定表头下标为0的位置存放根结点。,图5-4 图5-1树的孩子表示法,返回到本节目录,5.1.4 树的存储结构,3.孩子兄弟法孩子兄弟法存储结构是一种二叉链表,链表中每个结点包括三个域:数据值和两个指针,其中一个指针指向该结点的最左边第一个孩子,而另一个指针则指向该结点的下一个兄弟。每个结点的类型定义如下:typedef struct node2 ElemType data;/*数据域*/Struct node2*child,*brother;/*其第一个孩子和其右边兄弟的地
9、址*/CBNodeType;/*孩子兄弟结点类型*/,返回到本节目录,图5-5是图5-1所示树的孩子兄弟表示法的存储结构。其中T指向树的根结点。,图5-5 图5-1树的孩子兄弟表示法,返回到本节目录,5.2 二叉树,5.2.1 二叉树的定义5.2.2 二叉树的性质5.2.3 二叉树的存储结构5.2.4 二叉树的基本运算,返回到总目录,5.2.1 二叉树的定义,1二叉树的定义二叉树(Binary Tree)是有n(n0)个结点的有限集合。(1)该集合或者为空(n=0);(2)或者由一个根结点及两个不相交的分别称为左子树和右子树组成的非空树;(3)左子树和右子树同样又都是二叉树。,返回到本节目录,
10、5.2.1 二叉树的定义,2二叉树的形态二叉树归纳起来有五种形态,如图5-7所示。,(a)空二叉树(b)只有一个根结点(c)右子树为空(d)左子树为空(e)左、右子树非空图5-7 二叉树的五种形态,返回到本节目录,5.2.2 二叉树的性质,性质1:在二叉树的第i层上至多有2i-1个结点(i1)。性质2:深度为k的二叉树中至多有2k-1个结点。性质3:对任意一棵二叉树T,如果其叶子结点数为n0,度为2的结点数为n2,则有n0=n2+1。,返回到本节目录,5.2.2 二叉树的性质,下面介绍两种特殊的二叉树。(1)满二叉树一棵深度为k,且有2k-1个结点的二叉树称为满二叉树。图5-9(a)所示是一棵
11、深度为4的满二叉树,其特点是每一层上的结点都具有最大的结点数。(2)完全二叉树在一棵二叉树中,除最后一层外,若其它层都是满的,并且最后一层或者是满的,或者是在右边缺少连续的若干个结点,则称此二叉树为完全二叉树。据此得知满二叉树是完全二叉树的特例。图5-9(b)是一棵深度为4 的完全二叉树。,返回到本节目录,满二叉树和完全二叉树示例,(a)一棵满二叉树(b)一棵完全二叉树图5-9 一棵满二叉树和一棵完全二叉树示意图,返回到本节目录,5.2.2 二叉树的性质,性质4:具有n个结点的完全二叉树的深度为。性质5:如果一棵有n个结点的完全二叉树(其深度为)的结点按层次(从第1层到第层,每层从左到右。则对
12、任一结点i(1in)有:(1)如果i=1,结点i是根结点,无双亲;如果i1,则其双亲结点是结点i/2。(2)如果2in,则结点i无左孩子,该结点为叶子结点;否则其左孩子是结点2i。(3)如果2i+1n,则结点i无右孩子,该结点为叶子结点;否则其左孩子是结点2i+1。,返回到本节目录,5.2.3 二叉树的存储结构,1顺序存储结构顺序存储一棵二叉树时,先对该二叉树中的各结点进行编号,然后以各结点的编号为下标,把各结点的值存到一维数组中。其编号过程为:首先,把树的根结点的编号定为1,然后按照层次从上到下,从左到右的顺序对每一结点进行编号。当一个结点的双亲结点的编号为i时,若它是左孩子,则编号为2i,
13、若它是右孩子,则编号为2i+1。如图5-10(a)所示的二叉树(各结点上方的数字就是该结点的编号)对应的顺序存储结构为图5-10(b)所示。,返回到本节目录,顺序存储的二叉树示例,一棵带编号的二叉树,(b)对应的顺序存储结构图5-10 一棵二叉树及其顺序存储结构,返回到本节目录,5.2.3 二叉树的存储结构,2链式存储结构对于一般的二叉树,通常采用二叉链表示。链表中的每个结点包含两个指针,分别指向该结点的左孩子和右孩子。在二叉树的链式存储结构中,结点的类型定义如下:Typedef struct tnode ElemType data;/*数据域*/struct tnode*lchild,*rc
14、hild;/*左、右孩子指针域*/BTNode;/*二叉树结点存储类型*/其中,data域中存入结点的数据值,lchild和rchild分别表示左指针域和右指针域,分别存储其左、右孩子结点的地址。,返回到本节目录,图5-11 二叉树链式存储结构,如图5-10的二叉树链式存储结构如图5-11所示。,返回到本节目录,5.2.4 二叉树的基本运算,二叉树的常用运算有以下几种:(1)bt=CreateBTree(str):根据二叉树的广义表表示法str建立二叉树bt。(2)BTHeight(bt):求一棵二叉树bt的高度。(3)NodeCount(bt):求一棵二叉树bt的结点个数。(4)LeafCo
15、unt(bt):求一棵二叉树bt的叶子结点个数。(5)DispBTree(bt):以广义表表示法输出一棵二叉树bt。,返回到本节目录,5.3 二叉树的建立和遍历,5.3.1 二叉树的建立和输出5.3.2 二叉树的遍历5.3.3 由遍历序列恢复二叉树,返回到总目录,5.3.1 二叉树的建立和输出,1二叉树的建立二叉树的建立是二叉树的重要运算之一,我们介绍的方法是:用字符ch扫描用广义表表示法输入的二叉树的字符串str。分以下几种情况:(1)若ch=(,则将前面刚创建的结点作为双亲结点进栈,并置k=1,表示其后创建的结点将作为这个结点的左孩子结点。(2)若ch=),表示栈中结点的左右孩子结点处理完
16、毕,退栈。(3)若ch=,,表示要创建一个结点,并根据k值建立它与栈中结点之间的联系,当k=1时,表示这个结点作为栈中结点的左孩子结点,当k=2时,表示这个结点作为栈中结点的右孩子结点。如此循环直到str处理完毕。算法中使用一个栈st保存双亲结点,top为其栈顶指针,k指定其后处理的结点是双亲结点(保存在栈中)的左孩子结点(k=1)还是右孩子结点(k=2)。,返回到本节目录,1二叉树的建立,(1)二叉树的存储结构及相关类型的定义如下:#define NULL 0/*定义空指针为0*/#define MaxSize 100/*树的最大元素个数为100*/typedef char ElemType
17、;/*重定义char为ElemType类型*/typedef struct tnode ElemType data;/*数据域*/struct tnode*lchild,*rchild;/*左、右孩子指针*/BTNode;/*二叉树结点类型*/,返回到本节目录,1二叉树的建立算法,(2)二叉树的建立对应的算法如算法5.1所示。算法5.1BTNode*CreateBTree(char*str)BTNode*bt,*stMaxSize,*p=NULL;int top=-1,k,j=0;char ch;bt=NULL;ch=strj;while(ch!=0)switch(ch)case(:top+;
18、/*若是左括号,则先入栈*/sttop=p;k=1;break;case):top-;break;/*若是右括号,则出栈*/,返回到本节目录,1二叉树的建立算法,case,:k=2;break;/*若是逗号,则有右子树*/default:/*若是其它字符,则生成新的二叉树结点*/p=(BTNode*)malloc(sizeof(BTNode);p-data=ch;p-lchild=p-rchild=NULL;if(bt=NULL)bt=p;else switch(k)case 1:sttop-lchild=p;break;case 2:sttop-rchild=p;break;j+;ch=st
19、rj;return(bt);,返回到本节目录,5.3.1 二叉树的建立和输出,2用广义表表示法输出二叉树 其过程是:对于非空二叉树bt,先输出其元素值,当存在左孩子结点或右孩子结点时,输出一个(符号,然后递归处理左子树,输出一个,符号,递归处理右子树,最后输出一个)。对应的算法如算法5.2。,返回到本节目录,2用广义表表示法输出二叉树,算法5.2 void DispBTree(BTNode*bt)if(bt!=NULL)printf(%c,bt-data);if(bt-lchild!=NULL)printf();DispBTree(bt-lchild);if(bt-rchild!=NULL)p
20、rintf(,);DispBTree(bt-rchild);printf();,返回到本节目录,5.3.2 二叉树的遍历,一棵二叉树由根结点(D)、根结点的左子树(L)和根结点的右子树(R)三部分组成。一般限定先左后右的次序,那么只有三种遍历:DLR(根左右)、LDR(左根右)、LRD(左右根)。我们将这三种遍历方法称作前(根)序遍历,中(根)遍历和后(根)序遍历。也可以对二叉树的每个层次的各结点按从左至右进行遍历(按层次遍历),下面我们分别介绍这几种遍历方法。,返回到本节目录,1.前(根)序遍历二叉树(DLR),有些教材称为先(根)序遍历。若二叉树为空,遍历结束。否则依次执行以下操作:(1)
21、访问根结点;(2)前序遍历根结点的左子树;(3)前序遍历根结点的右子树。前序遍历的递归算法如算法5.3所示。以图5-10为例,进行前序遍历的输出序列为:ABDCEGF。,返回到本节目录,前序遍历的递归算法,算法5.3void PreOrder(BTNode*bt)/*前序遍历二叉树BT*/if(bt=NULL)return;/*递归调用的结束条件*/else printf(%c,bt-data);/*输出结点的数据域*/PreOrder(bt-lchild);/*前序递归遍历左子树*/PreOrder(bt-rchild);/*前序递归遍历右子树*/,返回到本节目录,2.中(根)序遍历二叉树(
22、LDR),若二叉树为空,遍历结束。否则依次执行以下操作:(1)中序遍历根结点的左子树;(2)访问根结点;(3)中序遍历根结点的右子树。中序遍历的递归算法如算法5.4所示。以图5-10为例,进行中序遍历的输出序列为:DBAGECF。,返回到本节目录,中序遍历的递归算法,算法5.4void InOrder(BTNode*bt)/*中序遍历二叉树BT*/if(bt=NULL)return;/*递归调用的结束条件*/else InOrder(bt-lchild);/*中序递归遍历左子树*/printf(%c,bt-data);/*输出结点的数据域*/InOrder(bt-rchild);/*中序递归遍
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实用教程C语言版 数据结构 实用教程 语言版 章树
链接地址:https://www.31ppt.com/p-5898665.html