数据结构严蔚敏版第06章.ppt
《数据结构严蔚敏版第06章.ppt》由会员分享,可在线阅读,更多相关《数据结构严蔚敏版第06章.ppt(93页珍藏版)》请在三一办公上搜索。
1、数据结构,第六章 树和二叉树2023/9/11,6.1 树的类型定义,数据对象D:D是具有相同特性的数据元素的集合。数据关系R:若D为空集,则称为空树;否则:(1)在D中存在唯一的称为根的数据元素root,(2)当n1时,其余结点可分为m(m0)个互不相交的有限集 T1,T2,Tm,其中每一棵子集本身又是一棵符合本定义的树,称为根root的子树。基本操作:查找:Root(T);Value(T,cur_e);Parent(T,cur_e);LeftChild(T,cur_e);TreeEmpty(T);TreeDepth(T);TraverseTree(T,Visit();,6.1 树的类型定义
2、,插入:InitTree(,6.1 树的类型定义,和线性结构的比较,A(B(E(K,L),F),C(G),D(H(M),I,J)嵌套括号表示法,树的表示方法:,基本术语,结点:数据元素+若干指向子树的分支。结点的度:分支的个数。树的度:树中所有结点的度的最大值。叶子结点:度为零的结点。分支结点:度大于零的结点;路径和路径长度。孩子结点、双亲结点、兄弟结点、堂兄弟、祖先结点、子孙结点。边:双亲节点x到子结点y的有序对(x,y)。结点的层次:假设根结点的层次为1,第i 层的结点的子树根结点的层次为i+1。规定根的层数为0。树的深度:树中叶子结点所在的最大层次。森林:是m(m0)棵互不相交的树的集合
3、任何一棵非空树是一个二元组Tree=(root,F)其中:root被称为根结点,F被称为子树森林。,6.2 二叉树的类型定义,二叉树的定义,定义:二叉树是由n(n=0)个结点的有限集合构成,此集合或者为空集,或者由一个根结点及两棵互不相交的左右子树组成,并且左右子树都是二叉树。与树的关系:这也是一个递归定义。区别:二叉树结点的子树要区分左子树和右子树,即使只有一棵子树也要进行区分,说明它是左子树,还是右子树。,二叉树的5种基本形态,二叉树的主要基本操作:,查找:Root(T);Value(T,e);Parent(T,e);LeftChild(T,e);RightChild(T,e);LeftS
4、ibling(T,e);RightSibling(T,e);BiTreeEmpty(T);BiTreeDepth(T);PreOrderTraverse(T,Visit();InOrderTraverse(T,Visit();PostOrderTraverse(T,Visit();LevelOrderTraverse(T,Visit();插入:InitBiTree(,性质1:在二叉树的第i层上至多有2i-1个结点(i=1)。证明:采用归纳法证明此性质。当i=1时,只有一个根结点,2i-1=20=1,命题成立。现在假定第i1层上命题成立,则第i1层上至多有2i-2个结点。由于二叉树每个结点的度最
5、大为2,故在第i层上最大结点数为第i1层上最大结点数的二倍,即22i-22i-1。命题得到证明。,二叉树的重要特性:,性质2:深度为k的二叉树至多有2k1个结点(k=1).证明:深度为k的二叉树的最大的结点时为二叉树中每层上的最大结点数之和,由性质1得到每层上的最大结点数2i-1(第i层上的最大结点数),二叉树的重要特性:,二叉树的重要特性:,性质3:对任何一棵二叉树,如果其终端结点数为n0,度为2的结点数为n2,则n0n21。证明:设二叉树中度为1的结点数为n1,二叉树中总结点数为N,因为二叉树中所有结点均小于或等于2,所以有:Nn0n1n2(1)再看二叉树中的分支数,除根结点外,其余结点都
6、有一个进入分支,设B为二叉树中的分支总数,则有:NB1。由于这些分支都是由度为1和2的结点射出的,所以有:Bn1+2*n2 NB1n12n21(2)由式(1)和(2)得到:n0+n1+n2=n1+2*n2+1 n0n21,两种特殊形态的二叉树:一棵深度为k且由2k-1个结点的二叉树称为满二叉树。如果深度为k、由n个结点的二叉树中各结点能够与深度为k的顺序编号的满二叉树从1到n标号的结点相对应,则称这样的二叉树为完全二叉树。完全二叉树的特点是:(1)所有的叶结点都出现在第k层或k1层。(2)对任一结点,如果其右子树的最大层次为h,则其左子树的最大层次为h或h1。,满二叉树和完全二叉树,性质4:具
7、有n个结点的完全二叉树的深度为log2n1。符号x表示不大于x的最大整数。证明:假设此二叉树的深度为k,则根据性质2及完全二叉树的定义得到:2k-11n=2k-1 或 2k-1=n2k取对数得到:k1log2nk 因为k是整数。所以有:klog2n1。,二叉树的重要特性,性质5:如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到第log2n+1层,每层从左到右),则对任一结点i(11,则其双亲是结点i/2。(2)如果2in,则结点i为叶子结点,无左孩子;否则,其左孩子是结点2i。(3)如果2i1n,则结点i无右孩子;否则,其右孩子是结点2i1。证明:略!,完全二叉树的特点:,6.3
8、二叉树的存储结构,1.顺序存储结构,它是用一组连续的存储单元存储二叉树的数据元素。因此,必须把二叉树的所有结点安排成为一个恰当的序列,结点在这个序列中的相互位置能反映出结点之间的逻辑关系,用编号的方法:#define max-tree-size 100Typedef telemtype sqbitreemax-tree-size;Sqbitree bt 从树根起,自上层至下层,每层自左至右的给所有结点编号。,完全二叉树,表示该处没有元素存在仅仅为了好理解,一般二叉树,1.顺序存储结构,缺点:有可能对存储空间造成极大的浪费,在最坏的情况下,一个深度为H且只有H个结点的右单支树确需要2h-1个结点
9、存储空间。而且,若经常需要插入与删除树中结点时,顺序存储方式不是很好!,1.顺序存储结构,(2)二叉链表法,Typedef struct BiTNode TelemType data;struct BiTNode*lchild,*rchild;BiTNode,*BiTree;,2)二叉链表法,二叉树的二叉链表存储表示,Status CreateBiTree(BiTree*T)/*创建一棵二叉树*/scanf(,6.3 二叉树的存储结构,链式存储结构的算法:,三叉链表法,Typedef struct TBiTNode TelemType data;struct TBiTNode*lchild,*
10、rchild,*parent;BiTNode,*BiTree;,三叉链表法,二叉树的三叉链表存储表示,6.4 二叉树的遍历,一、问题的提出,顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次。“访问”的含义可以很广,如:输出结点的信息等。对“二叉树”而言,可以有三条搜索路径:1先上后下的按层次遍历;2先左(子树)后右(子树)的遍历;3先右(子树)后左(子树)的遍历。,6.4 二叉树的遍历,二、先左后右的遍历算法,先(根)序的遍历算法:若二叉树为空树,则空操作;否则,(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。中(根)序的遍历算法:若二叉树为空树,
11、则空操作;否则,(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。后(根)序的遍历算法:若二叉树为空树,则空操作;否则,(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。,6.4 二叉树的遍历,示例,先序:/-ab+cd中序:a-b/c+d后序:ab-cd+/,先序:-a+/bcd中序:a-b/c+d后序:abc/d+-,先序:+-a/bcd中序:a-b/c+d后序:abc/-d+,分别称为表达式的前缀表示法、中缀表示法和后缀表示法(逆波兰表示法)。,6.4 二叉树的遍历,三、算法的递归描述,void Preorder(BiTree T,void(*visit)(TEl
12、emType/遍历右子树,void InOrderTraverse(BiTree T,void(*visit)(TElemType/访问结点,四、先序遍历算法的非递归描述,先序遍历的非递归算法。t指向根,p为指针,指向当前结点。使用一个堆栈s(),top为栈指针 1 if t=NULL 2 then 输出 这是一棵空树 3 else p=t,top=0 4 DO 5 while p!=NULL 6 输出 data(p);7 top+;8 if topn9 then 调用 栈满 10 else stop=p,p=lchild(p)11 if top!=012 p=stop;top-;p=rchi
13、ld(p)13while(top=0&p=null)算法结束,6.4 二叉树的遍历,四、先序遍历算法的非递归描述,1 if t=NULL2 then 输出 这是一棵空树 3 else p=t,top=0 4 DO 5 while p!=NULL 6 输出 data(p);7 top+;8 if topn9 then 调用 栈满10 else stop=p,p=lchild(p)11 if top!=012 p=stop;top-;p=rchild(p)13while(top=0&p=null)算法结束,中序遍历的非递归算法,中序遍历的非递归算法,使用堆栈s(),top为指针,t指向根,p为指针
14、,指向当前结点1 top=0,p=t2 DO 3 while(p!=NIL)4 top+5 if(topn)6 then 调用 栈满7 else stop=p;p=Lchild(p)8 if top!=09 then p=stop,top-10 输出 data(p)11 p-rchild(p)12 while(top=0 算法结束,1 top=0,p=t2 DO 3 while(p!=NIL)4 top+5 if(topn)6 then 调用 栈满7 else stop=p;p=Lchild(p)8 if top!=09 then p=stop,top-10 输出 data(p)11 p-rc
15、hild(p)12 while(top=0,五、遍历算法的应用举例:,1、统计二叉树中叶子结点的个数(先序遍历),void CountLeaf(BiTree T,int/统计右子树中叶子结点个数,五、遍历算法的应用举例,2、求二叉树的深度(后序遍历),int Depth(BiTree T)if(!T)depthval=0;else depthLeft=Depth(T-lchild);depthRight=Depth(T-rchild);depthval=1+(depthLeft depthRight?depthLeft:depthRight);return depthval;,五、遍历算法的应
16、用举例,3、复制二叉树(后序遍历),/生成一个二叉树的结点BiTNode*GetTreeNode(TElemType item,BiTNode*lptr,BiTNode*rptr)if(!(T=(BiTNode*)malloc(sizeof(BiTNode)exit(1);T-data=item;T-lchild=lptr;T-rchild=rptr;return T;,五、遍历算法的应用举例,3、复制二叉树(后序遍历),BiTNode*CopyTree(BiTNode*T)if(!T)return NULL;if(T-lchild)newlptr=CopyTree(T-lchild);els
17、e newlptr=NULL;if(T-rchild)newrptr=CopyTree(T-rchild);else newrptr=NULL;newnode=GetTreeNode(T-data,newlptr,newrptr);return newnode;,6.5 线索二叉树,一、何谓线索二叉树?,遍历二叉树是按一定的规则将二叉树中结点排列成一个线性序列;这实际上是把一个非线性结构进行线性化的操作。以二叉链表作为存储结构时,对于某个结点只能找到其左右孩子,而不能直接得到结点在任一序列中的前驱或后继。要想得到只能通过遍历的动态过程才行。怎样保存遍历过程中得到的信息呢?(1增加两个指针(2利
18、用结构中的空链域,并设立标志。即采用如下的形式:,6.5 线索二叉树,何谓线索二叉树?,指向该线性序列中的“前驱”和“后继”的指针,称作“线索”。包含“线索”的存储结构,称作“线索链表”;与其相应的二叉树,称作“线索二叉树”。对线索链表中结点的约定:在二叉链表的结点中增加两个标志域,并作如下规定:若该结点的左子树不空,则lchild域的指针指向其左子树,且左标志域 ltag的值为0;否则,lchild域的指针指向其“前驱”,且左标志ltag的值为1。若该结点的右子树不空,则rchild域的指针指向其右子树,且右标志域rtag的值为0;否则,rchild域的指针指向其“后继”,且右标志rtag的
19、值为1。,6.5 线索二叉树,6.5 线索二叉树,线索链表的结构描述:,typedef enum Link,Thread PointerThr;/Link=0:指针,Thread=1:线索typedef struct BiThrNodeTElemType data;struct BiThrNode*lchild,*rchild;/左右指针PointerThr LTag,RTag;/左右标志 BiThrNode,*BiThrTree;,6.5 线索二叉树,找结点的后继,线索化:对二叉树以某种次序遍历使其变为线索二叉树的过程叫做线索化。下面以中序为例看看如何在线索二叉树中找结点的后继。(1树中所有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 严蔚敏版第 06
链接地址:https://www.31ppt.com/p-5986027.html