数据结构第六章1课件_第1页
数据结构第六章1课件_第2页
数据结构第六章1课件_第3页
数据结构第六章1课件_第4页
数据结构第六章1课件_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1数据结构

DataStructure第八讲2第六章树和二叉树树型结构:一种非线性数据结构,一个直接前驱,可能有多个直接后继,是1:n关系。是以分支关系定义的层次结构。3线性结构树型结构第一个数据元素

(无前驱)

根结点

(无前驱)最后一个数据元素

(无后继)多个叶子结点

(无后继)其它数据元素(一个前驱、一个后继)其它数据元素(一个前驱、多个后继)56.1

树的类型定义1.树的定义注:树的定义具有递归性,即树中还有树。由一个或多个(n≥0)结点组成的有限集合T,有且仅有一个结点称为根(root),当n>1时,其余的结点分为m(m≥0)个互不相交的有限集合T1,T2,…,Tm。每个集合本身又是棵树,被称作这个根的子树。ABCGEIDHFJMLKA树的示例数据对象D:D是具有相同特性的数据元素的集合。

若D为空集,则称为空树。否则:(1)在D中存在唯一的称为根的数据元素root;

(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每一棵子集本身又是一棵符合本定义的树,称为根root的子树。

数据关系R:ADTTree{}//ADTTree基本操作P:8Root(T)//求树的根结点

查找类:Value(T,cur_e)//求当前结点的元素值

Parent(T,cur_e)//求当前结点的双亲结点LeftChild(T,cur_e)//求当前结点的最左孩子RightSibling(T,cur_e)//求当前结点的右兄弟TreeEmpty(T)//判定树是否为空树TreeDepth(T)//求树的深度TraverseTree(T,Visit())//遍历10

ClearTree(&T)//将树清空

删除类:DestroyTree(&T)//销毁树的结构DeleteChild(&T,&p,i)//删除结点p的第i棵子树12图形表示法:教师学生其他人员2007级2008级2009级2010级……河南大学物理系数学系化学系……叶子根子树14左孩子-右兄弟表示法ABCDEFGHIJKLM数据左孩子

右兄弟(A(B(E(K,L),F),C(G),D(H(M),I,J)))15(1)有确定的根;(2)树根和子树根之间为有向关系。有向树:有序树:子树之间存在确定的次序关系。无序树:子树之间不存在确定的次序关系。2.基本术语16结点:结点的度:树的度:叶子结点:分支结点:数据元素+若干指向子树的分支分支的个数树中所有结点的度的最大值度为零的结点度大于零的结点DHIJM17(从根到结点的)路径:孩子结点、双亲结点兄弟结点、堂兄弟祖先结点、子孙结点结点的层次:树的深度:

由从根到该结点所经分支和结点构成ABCDEFGHIJMKL假设根结点的层次为1,第l层的结点的子树根结点的层次为l+1树中叶子结点所在的最大层次18任何一棵非空树是一个二元组

Tree=(root,F)其中:root被称为根结点

F被称为子树森林森林:是m(m≥0)棵互不相交的树的集合ArootBCDEFGHIJMKLF20讨论3:树的链式存储方案应该怎样制定?可规定为:从上至下、从左至右将树的结点依次存入内存。重大缺陷:复原困难(不能唯一复原就没有实用价值)。讨论2:树的顺序存储方案应该怎样制定?可用多重链表:一个前趋指针,n个后继指针。细节问题:树中结点的结构类型样式该如何设计?

即应该设计成“等长”还是“不等长”?缺点:等长结构太浪费(每个结点的度不一定相同);不等长结构太复杂(要定义好多种结构类型)。解决思路:先研究最简单、最有规律的树,然后设法把一般的树转化为简单树。二叉树215.树的运算

要明确:1.普通树(即多叉树)若不转化为二叉树,则运算很难实现。2.二叉树的运算仍然是插入、删除、修改、查找、排序等,但这些操作必须建立在对树结点能够“遍历”的基础上!(遍历——指每个结点都被访问且仅访问一次,不遗漏不重复)。本章重点:二叉树的表示和实现1.二叉树的定义定义:是n(n≥0)个结点的有限集合,由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。逻辑结构:

一对二(1:2)

基本特征:①每个结点最多只有两棵子树(不存在度大于2的结点);②左子树和右子树次序不能颠倒(有序树)。问:具有3个结点的二叉树可能有几种不同形态?普通树呢?

5种/2种24

二叉树或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。ABCDEFGHK根结点左子树右子树26二叉树的抽象数据类型定义ADTBinaryTree{数据对象D:数据关系R:基本操作P:}ADTBinaryTree若D=Φ,则R=Φ;若D≠Φ,则R={H};存在二元关系:①root唯一//关于根的说明②Dj∩Dk=Φ//关于子树不相交的说明③……//关于数据元素的说明

④……

//关于左子树和右子树的说明D是具有相同特性的数据元素的集合。//至少有20个27性质1

:用归纳法证明:

归纳基:

归纳假设:

归纳证明:i=1

层时,只有一个根结点:

2i-1=20=1;假设对所有的j,1≤j

i,命题成立;二叉树上每个结点至多有两棵子树,则第i层的结点数=2i-22=2i-1

。在二叉树的第i(i≥1)层上至多有2i-1

个结点。28性质2

证明:基于上一条性质,深度为k的二叉树上的结点数至多为

20+21+

+2k-1=2k-1

。深度为k的二叉树上至多含2k-1个结点(k≥1)。30两类特殊的二叉树:满二叉树:指的是深度为k且含有2k-1个结点的二叉树。完全二叉树:树中所含的n个结点和满二叉树中编号为1至n的结点一一对应。123456789101112131415abcdefghij31性质4:

具有n个结点的完全二叉树的深度为

log2n+1。证明:设完全二叉树的深度为k则根据第二条性质得2k-1≤n<2k

k-1≤log2n<k

因为k只能是整数,因此,k=log2n

+1。32性质5若对含n个结点的完全二叉树从上到下且从左至右进行1

至n

的编号,则对完全二叉树中任意一个编号为i

的结点:

(1)若i=1,则该结点是二叉树的根,无双亲,否则,编号为i/2的结点为其双亲结点;

(2)若2i>n,则该结点无左孩子,

否则,编号为2i的结点为其左孩子结点;

(3)若2i+1>n,则该结点无右孩子结点,

否则,编号为2i+1的结点为其右孩子结点。333.深度为9的二叉树中至少有

个结点。

A)29

B)28

C)9D)29-12.深度为k的二叉树的结点总数,最多为

个。

A)2k-1

B)log2kC)2k-1D)2k课堂练习:1.树T中各结点的度的最大值称为树T的

A)高度B)层次C)深度D)度√√√34课堂讨论:Q1:满二叉树和完全二叉树有什么区别?A1:满二叉树是叶子一个也不少的树,而完全二叉树虽然前n-1层是满的,但最底层却允许在右边缺少连续若干个结点。

满二叉树是完全二叉树的一个特例。Q3:设一棵完全二叉树具有1000个结点,则它有

个叶子结点,有

个度为2的结点,有

个结点只有非空左子树,有

个结点只有非空右子树。48948810Q2:为什么要研究满二叉树和完全二叉树这两种特殊形式?A1:因为只有这两种形式可以实现顺序存储!由于最后一层叶子数为489个,是奇数,说明有1个结点只有非空左子树;而完全二叉树中不可能出现非空右子树(0个)。A3:易求出总层数和末层叶子数。总层数k=log2n+1=10;且前9层总结点数为29-1=511

(完全二叉树的前k-1层肯定是满的)所以末层叶子数为1000-511=489个。35请注意叶子结点总数≠末层叶子数!还应当加上第k-1层(靠右边)的0度结点个数。分析:末层的489个叶子只占据了上层的245个结点(489/2)上层(k=9)右边的0度结点数还有29-1-245=11个!另一法:可先求2度结点数,再由此得到叶子总数。首先,k-2层的28-1(255)个结点肯定都是2度的(完全二叉)另外,末层叶子(刚才已求出为489)所对应的双亲也是度=2,(共有489/2=244个)。所以,全部2度结点数为255(k-2层)+244(k-1层)=499个;总叶子数=2度结点数+1=500个。第i层上的满结点数为2i-1所以,全部叶子数=489(末层)+11(k-1层)=500个。度为2的结点=叶子总数-1=499个。366.3二叉树的存储结构二、二叉树的链式存储表示一、二叉树的顺序存储表示37按二叉树的结点“自上而下、从左至右”编号,用一组连续的存储单元存储。ABCDEFGHI[1][2][3][4][5][6][7][8][9]ABCGEIDHF问:顺序存储后能否复原成唯一对应的二叉树形状?答:若是完全/满二叉树则可以做到唯一复原。而且有规律:下标值为i的双亲,其左孩子的下标值必为2i,其右孩子的下标值必为2i+1(即性质5)例如,对应[2]的两个孩子必为[4]和[5],即B的左孩子必是D,右孩子必为E。T[0]一般不用一、顺序存储结构38讨论:不是完全二叉树怎么办?答:一律转为完全二叉树!方法很简单,将各层空缺处统统补上“虚结点”,其内容为空。AB^C^^^D^…E[1][2][3][4][5][6][7][8][9].[16]ABECD缺点:①浪费空间;②插入、删除不便

39#defineMAX_TREE_SIZE100//二叉树的最大结点数typedefTElemTypeSqBiTree[MAX_TREE_SIZE];//0号单元存储根结点SqBiTreebt;二叉树的顺序存储表示40二、链式存储结构dataleft_childright_childdataleft_childright_child一般从根结点开始存储。

(相应地,访问树中结点时也只能从根开始)注:如果需要倒查某结点的双亲,可以再增加一个双亲域(直接前趋)指针,将二叉链表变成三叉链表。用二叉链表即可方便表示。41例:

ABECD^AB^D^C^^E^42ADEBCFrootlchilddatarchild结点结构:1.二叉链表43typedefstruct

BiTNode

{//结点结构

TElemTypedata;

structBiTNode*lchild,*rchild;//左右孩子指针}BiTNode,*BiTree;lchilddatarchild结点结构:C语言的类型描述如下:44ADEBCFroot2.三叉链表parent

lchilddatarchild结点结构:45

typedefstruct

TriTNode

{//结点结构

TElemTypedata;

structTriTNode*lchild,*rchild;//左右孩子指针

structTriTNode

*parent;//双亲指针

}TriTNode,*TriTree;parentlchilddatarchild结点结构:C语言的类型描述如下:460123456

dataparent结点结构:3.双亲链表LRTagLRRRL47

typedefstruct

BPTNode

{//结点结构

TElemTypedata;

int

*parent;//指向双亲的指针

charLRTag;//左、右孩子标志域

}BPTNode

typedefstructBPTree{//树结构

BPTNodenodes[MAX_TREE_SIZE];

intnum_node;//结点数目

introot;//根结点的位置

}BPTree486.4二叉树的遍历遍历定义——指按某条搜索路线遍访每个结点且不重复(又称周游)。遍历用途——它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。

遍历方法——牢记一种约定,对每个结点的查看都是“先左后右”。49

“遍历”是任

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论