收藏 分享(赏)

计算机数据结构.ppt

上传人:无敌 文档编号:814381 上传时间:2018-04-26 格式:PPT 页数:43 大小:717.50KB
下载 相关 举报
计算机数据结构.ppt_第1页
第1页 / 共43页
计算机数据结构.ppt_第2页
第2页 / 共43页
计算机数据结构.ppt_第3页
第3页 / 共43页
计算机数据结构.ppt_第4页
第4页 / 共43页
计算机数据结构.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

1、1,数据结构课程的内容,2,2.4 树和二叉树,一、 树的基本概念二、 二叉树的表示和实现三、 树和二叉树的转换四、 树的应用(二叉排序树),树结构的特点:非线性结构,一个直接前驱,但可能有多个直接后继。,(一对多结构),3,一、树的基本概念,讨论5个问题:什么是树? 关于树有哪些常用术语?3. 树的逻辑结构?4. 树的存储结构?5. 树的基本运算?,4,1. 树的定义,注1:n=0时,为空树,空树是没有结点的树。注2:树的定义具有递归性,即“树中还有树”。,由一个或多个(n0)结点组成的有限集合T,有且仅有一个结点称为根(root),当n1时,其余的结点分为m(m0)个互不相交的有限集合T1

2、,T2,Tm。每个集合本身又是棵树,被称作这个根的子树 。,5,2. 若干术语,6,2. 若干术语(续),结点结点的度结点的层次终端结点分支结点,树的度树的深度(或高度),从根到该结点的层数(根结点算第一层)即度为0的结点,即叶子即度不为0的结点(也称为内部结点),所有结点度中的最大值(Max各结点的度)指所有结点中最大层次数(Max各结点的层次),问:右上图中的结点数 ;树的度 ;树的深度,13,3,4,7,3. 树的逻辑结构,一对多(1:n),有多个直接后继(如家谱树、目录树等),但只有一个根结点,且子树之间互不相交。,4. 树的存储结构,讨论1:树是非线性结构,该怎样存储?,特点:,仍然

3、有顺序存储、链式存储等方式。,8,先研究二叉树!,讨论3:树的链式存储方案应该怎样制定?,复原困难,讨论2:树的顺序存储方案应该怎样制定?,可用多重链表:一个前趋指针,n个后继指针。 细节问题: 树中结点的结构类型样式该如何设计? 即应该设计成“等长”还是“不等长”? 缺点: 等长结构太浪费(每个结点的度不一定相同); 不等长结构太复杂(要定义好多种结构类型)。,先研究最简单、最有规律的树,然后设法把一般的树转化为简单树来处理。,可规定为:,从上至下、从左至右将树的结点依次存入内存。,重大缺陷:,解决思路:,复原不具有唯一性就无实用价值!,9,5. 树的运算,要明确:1. 普通树(即多叉树)若

4、不转化为二叉树,则运算很难实现。2. 二叉树的运算仍然是插入、删除、修改、查找、排序等,但这些操作必须建立在对树结点能够“遍历”的基础上。,本节重点:二叉树的表示和实现!,遍历指每个结点都被访问且仅访问一次,不遗漏不重复,10,二、二叉树的表示和实现,为何要重点研究每结点最多只有两个 “叉” 的树?二叉树的结构最简单,规律性最强;可以证明,所有树都能转为唯一对应的二叉树,不失一般性。,1. 二叉树的定义2. 二叉树的性质二叉树的存储结构二叉树的基本运算(遍历),11,1. 二叉树的定义,定义:是n(n0)个结点的有限集合,由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成 (空

5、树也是二叉树)。逻辑结构: 一对二(1:2) 基本特征: 每个结点最多只有两棵子树(不存在度大于2的结点); 左子树和右子树次序不能颠倒。,讨论:具有3个结点的二叉树可能有几种不同形态?,有5种,基本形态:,一般的树有几种形态?,仅2种,12,2. 二叉树的性质,讨论1:第i层的结点数最多是多少?,性质1: 在二叉树的第i层上至多有2i-1个结点(i0)。,性质2: 深度为k的二叉树至多有2k-1个结点(k0)。,再提问:第i层上至少有 个结点?,1,讨论2:深度为k的二叉树,最多有多少个结点?,2i-1个,2k-1个,13,讨论3:二叉树的叶子数和度为2的结点数之间有关系吗?,性质3: 对于

6、任何一棵二叉树,若2度的结点数有n2个,则叶子数(n0)必定为n21 (即n0=n2+1),证明:二叉树中全部结点数nn0+n1+n2(叶子数度为1结点数度为2结点数)又二叉树中全部结点数nB+1 ( 总分支数根结点 ) (除根结点外,每个结点必有一个直接前趋,即一个分支)而 总分支数B= n1+2n2 (度为1结点必有1个直接后继,度为2结点必有2个)三式联立可得: n0+n1+n2= n1+2n2 +1, 即n0=n2+1,物理意义:叶子数度为2结点数1,14,3. 深度为9的二叉树中至少有 个结点。 )9 )8 ) )91,2.深度为的二叉树的结点总数,最多为 个。 )k-1 ) log

7、2k ) k )k,1. 树中各结点的度的最大值称为树的 。 ) 高度 ) 层次 ) 深度 ) 度,D,C,C,课堂练习:,3. 结论“ ”是正确的。 )二叉树的度为2 )树中结点的度可以小于2 )二叉树中至少有一个结点的度为2 )二叉树中任何一个结点的度都为2,B,15,满二叉树:一棵深度为k 且有2k -1个结点的二叉树。(特点:每层都“充满”了结点),完全二叉树:深度为k 的、有n个结点的二叉树,当且仅当其每一个结点都与深度为k 的满二叉树中编号从1至n的结点一一对应。(特点:k-1层都“满”,最后一层的左边也是满的),三种特殊的二叉树:,16,课堂讨论:,问1:为何要研究完全/满二叉树

8、这两种特殊的二叉树?答:因为它们在顺序存储方式下可以复原!问2:满二叉树和完全二叉树有什么区别?答:满二叉树是叶子一个也不少的树,而完全二叉树虽然前 n-1层是满的,但最底层却允许在右边缺少连续若干个结点。满二叉树是完全二叉树的一个特例。,17,对于两种特殊形式的二叉树(满二叉树和完全二叉树)还特别具备以下2个性质:,性质4: 具有n个结点的完全二叉树的深度必为log2n1,性质5: 对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号为2i1;其双亲的编号必为i/2 (i1 时为根除外)。,性质4证明:根据性质2,深度为k的二叉树最多只有2k-1个结

9、点,且完全二叉树的定义是与同深度的满二叉树前面编号相同,即它的总结点数n位于k层和k-1层满二叉树容量之间, 即 2k-1-1n2k-1 或2k-1n2k三边同时取对数得:k-1log2nlchild); printf(“%d”,root-data); LDR(root-rchild); return(0);,后序遍历算法LRD (Node *root)if(root !=NULL) LRD(root-lchild); LRD(root-rchild); printf(“%d”,root-data); return(0);,结点数据类型自定义typedef struct nodeint dat

10、a; struct node *lchild,*rchild; Node;Node *root;,先序遍历算法DLR( Node *root )if (root !=NULL) /非空二叉树 printf(“%d”,root-data); /访问DDLR(root-lchild); /递归遍历左子树LDLR(root-rchild); /递归遍历右子树R return(0); ,31,对遍历的分析:,1. 从前面的三种遍历算法可以知道:如果将print语句删去,从递归的角度看,这三种算法是完全相同的,或者说这三种遍历算法的访问路径是相同的,只是访问根结点的时机不同。,2. 二叉树遍历的时间效率

11、和空间效率:时间效率:O(n) /每个结点只访问一次空间效率:O(n) /占用的最大辅助空间( 因为n个结点肯定会有n1个空指针,即辅助空间为n ),32,例1:编写递归算法,计算二叉树中叶子结点的数目。,思路:输出叶子结点比较简单,用任何一种遍历算法,凡是左右指针均空者,则为叶子,将其统计并打印出来。,DLR(Node *root) /采用先序遍历的递归算法 if ( root!=NULL ) /非空二叉树条件,等效于 if(root) if(!root-lchild ,33,用空格字符表示无孩子或设指针为空,注:要实现遍历运算,必须先把二叉树存入电脑内,怎样建树?,试将下面的二叉树以二叉链

12、表形式存入计算机内。,考虑1:输入结点时怎样表示“无孩子”?考虑2:以何种遍历方式来输入并建树?,可以自行设计,将二叉树按先序遍历次序输入:A B C D E G F (/n),以先序遍历最为合适,让每个结点都能及时被连接到位。,34,附:建树算法:BiTNode *CreateBiTree( BiTNode *T ) /构造二叉树Tscanf(“%c”, /CreateBiTree,演示程序|建树及遍历,35,例2. 如何按层次输出二叉树中所有结点? 算法思路:既然要求从上到下,从左到右,则利用队列存放各子树结点的指针是个好办法,不能用递归算法。技巧:当根结点入队后,令其左、右孩子结点入队,

13、而左孩子出队时又令它的左右孩子结点入队,由此便可产生按层次输出的效果。,36,三、树与二叉树的转换,转换步骤:step1: 将树中同一结点的兄弟相连;,加线,抹线,旋转,讨论1:树如何转为二叉树?,用孩子兄弟表示法,step2: 保留结点的最左孩子连线,删除其它孩子连线;,step3: 将同一孩子的连线绕左孩子旋转45度角。,37,方法:加线抹线旋转,树转二叉树举例:,兄弟相连,长兄为父,孩子靠左,38,二叉树还原为树举例:,只需逆操作,把所有右孩子变为兄弟!,39,四、树的应用(二叉排序树),排序树带权树最优树,特点:路径带权值(例如长度)是带权路径长度最短的树,又称 哈夫曼树,用途之一是通

14、信中的压缩编码。,特点:所有结点“左小右大”,今天只介绍二叉排序树,40,1. 二叉排序树的定义,-或是一棵空树;或者是具有如下性质的非空二叉树: (1)左子树的所有结点数据值均小于根结点的数据值; (2)右子树的所有结点数据值均大于或等于根结点的数据值; (3)它的左右子树也分别为二叉排序树。,看图:判断它们是不是二叉排序树?,(a),(b),简言之:左小右大!,想一想:对二叉排序树中序遍历之后的结果是什么?,41,45,如果改变输入顺序为(24,53,45,45,12,24,90),,例:将序列(45,24,53,45,12,24,90)建为二叉排序树,则生成的二叉排序树形态不同,24,2

15、. 二叉排序树的生成,(就是连续插入新结点的过程),演示程序-建立二叉排序树,42,例:对序列(45,24,53, 23,12,50, 90)建立的二叉排序树进行查找。,3. 二叉排序树的查找,查找算法实现:Node *searchtree(Node *root,int k)/查找元素值为k while(root!=NULL) if(k= =root-data) /查找成功则返回此结点的指针值 printf(“success”);return(root); else if( kdata )root = root-lchild;/小于根结点查左子树 else root = root-rchild;/否则查右子树 printf(“fail”);return(NULL); /查找失败则返回空指针 ,43,中序遍历此二叉树,将会得到一个关键字的有序序列(即实现了排序运算);二叉排序树是一种动态表结构,即二叉排序树的生成过程就是不断地向二叉排序树中插入新的叶子结点,而且插入结点时只需修改指针而不必移动其它结点。二叉排序树上查找某关键字等于结点值的过程,其实就是走了一条从根到该结点的路径;其查找过程与顺序结构有序表中的折半查找相似,查找效率高(快速逼近)。比较的关键字次数此结点的层次数; 最多的比较次数树的深度(或高度)单支树的形态!,二叉排序树的优点:,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报