DS06数据结构树-二叉排序树_第1页
DS06数据结构树-二叉排序树_第2页
DS06数据结构树-二叉排序树_第3页
DS06数据结构树-二叉排序树_第4页
DS06数据结构树-二叉排序树_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、回顾:二分查找, 当线性表中数据元素是按大小顺序排列存放时,可以采用二分法 (折半查找)。,二分查找是每次在要查找的数据集合中取出中间元素关键字Kmid与要查找的关键字K进行比较,根据比较结果确定是否要进一步查找。 当 Kmid=K ,查找成功; 当 K Kmid,将在Kmid右半部分继续下一步查找 以此类推,每步的查找范围都将是上一次的一半。,优点:查找效率高 缺点:要求线性表,如果是进行动态查找,即需要对线性表进行插入、删除或排序操作,就必须移动大量的记录,当记录数很多时,这种移动的代价很大。,第4,4.4二叉搜索树,第4章 树,判定树的特点: 左子树的值都比根结点小 右子树的值都比根结点

2、大 中序遍历判定树得到的是一组有序的序列, 11个元素的二分查找判定树,4.4二叉搜索树,能否根据以上特点,利用树型结构来动态创建查找表呢?,第4章 树,4.4二叉搜索树,【定义】一个二叉搜索树是一棵二叉树,它可以为空。如果不为空,它将满足以下性质: 非空左子树的所有键值小于其根结点的键值。 非空右子树的所有键值大于其根结点的键值。 左、右子树都是二叉搜索树。,二叉搜索树,“二叉搜索树(BST,Binary Search Tree)”也称二叉排序树或二叉查找树,它是一种对排序和查找都很有用的特殊二叉树。, 二叉搜索树的动态查找, 二叉搜索树作为抽象数据结构的定义与普通二叉树相同,但操作集中多了

3、下列几个特别的函数:, Position Find( ElementType X, BinTree BST ):从二叉搜索树BST中查找元素X,返回其所在结点的地址; Position FindMin( BinTree BST ):从二叉搜索树BST中查找并返回最小元素所在结点的地址; Position FindMax( BinTree BST ) :从二叉搜索树BST中查找并返回最大元素所在结点的地址。,第4章 树,4.4二叉搜索树, BinTree Insert( ElementType X, BinTree BST ) BinTree Delete( ElementType X, Bin

4、Tree BST ),typedef Position BinTree, 二叉搜索树的查找操作Find,第4章 树,4.4二叉搜索树,查找从根结点开始,如果树为空,返回NULL,表示未找到关键字为X的结点。 若搜索树非空,则根结点关键字和X进行比较,依据比较结果,需要进行不同的处理: 若根结点键值小于X,满足条件的结点将不会出现在它的左子树,接下来的搜索只需在右子树中进行; 如果根结点的键值大于X,接下来的搜索将在左子树中进行; 若两者比较结果是相等,搜索完成,返回指向此结点的指针。, 二叉搜索树的查找操作Find,第4章 树,4.4二叉搜索树,Position Find( ElementTy

5、pe X, BinTree BST ) if( !BST ) return NULL; /查找失败 if( X BST-Data ) return Find( X, BST-Right ); /在右子树中继续查找 else if( X Data ) return Find( X, BST-Left ); /在左子树中继续查找 else /X = BST-Data return BST; /查找成功,返回找到结点的地址 ,Position IterFind( ElementType X, BinTree BST ) while( BST ) if( X BST-Data ) BST = BST-

6、Right; /向右子树中移动,继续查找 else if( X Data ) BST = BST-Left; /向左子树中移动,继续查找 else / X = BST-Data return BST; /查找成功,返回结点的找到结点的地址 return NULL; /查找失败 , 由于非递归函数的执行效率高,一般采用非递归的迭代来实现查找。 很容易将“尾递归”函数改为迭代函数,第4章 树,4.4二叉搜索树, 查找最大和最小元素,第4章 树, 最大元素一定是在树的最右分枝的端结点上 最小元素一定是在树的最左分枝的端结点上,4.4二叉搜索树,第4章 树,4.4二叉搜索树,Position Find

7、Max( BinTree BST ) if( !BST ) while( BST-Right ) BST = BST-Right; /沿右分支继续查找,直到最右叶结点 return BST; ,Position FindMin( BinTree BST ) if( !BST ) return NULL; /空的二叉搜索树,返回NULL else if( !BST-Left ) return BST; /找到最左叶结点并返回 else return FindMin( BST-Left ); /沿左分支继续查找 ,代码4.16 查找最小元素的递归函数,代码4.17 查找最大元素的迭代函数, 二叉搜

8、索树的插入,第4章 树,4.4二叉搜索树,分析将元素X插入二叉搜索树BST中关键是要找到元素应该插入的位置。位置的确定可以利用与查找函数Find类似的方法,如果在树BST中找到X,说明要插入的元素已存在,可放弃插入操作。如果没找到X,查找终止的位置就是X应插入的位置。,BinTree Insert( ElementType X, BinTree BST ) if( !BST ) /若原树为空,生成并返回一个结点的二叉搜索树 BST = malloc(sizeof(struct TreeNode); BST-Data = X; BST-Left = BST-Right = NULL; else

9、/开始找要插入元素的位置 if( X Data ) BST-Left = Insert( X, BST-Left); /递归插入左子树 else if( X BST-Data ) BST-Right = Insert( X, BST-Right); /递归插入右子树 / else X已经存在,什么都不做 return BST; ,第4章 树,4.4二叉搜索树,代码4.18 二叉搜索树的插入算法,【例4.8】以一年十二个月的英文缩写为键值,按从一月到十二月顺序输入它们,即输入序列为(Jan, Feb, Mar, Apr, May, Jun, July, Aug, Sep, Oct, Nov, D

10、ec),将产生什么样的二叉搜索树?,第4章 树,4.4二叉搜索树,对于一个无序序列可以通过构造一棵BST树而变成一个有序序列。 由算法知,每次插入的新结点都是BST树的叶子结点,即在插入时不必移动其它结点,仅需修改某个结点的指针。 利用BST树的插入操作,可以从空树开始逐个插入每个结点,从而建立一棵BST树.,第4章 树,4.4二叉搜索树,思考:用上述方法构造的含有n个结点BST树,其深度是多少?,深度:2n +1n,第4章 树,4.5 平衡二叉树,例不同的插入次序,将导致不同的深度。 (a) 按一月到十二月的自然月份序列输入所生成的; (b) 输入序列为(July, Feb, May, Ma

11、r, Aug, Jan, Apr, Jun, Oct, Sept, Nov, Dec) (c) 输入序列则是按月份字符串从小到大的顺序排列的。,深度:2n +1n, 二叉搜索树的删除,第4章 树,4.4二叉搜索树, 二叉搜索树的删除操作比其它操作更为复杂,有三种情况需要考虑:, 要删除的是叶结点可以直接删除,然后再修改其父结点的指针。,图4.28 二叉搜索树叶结点的删除,例:删除 35,第4章 树,4.4二叉搜索树,图4.29 具有一个子树的结点删除, 要删除的结点只有一个孩子结点删除之前需要改变其父结点的指针,指向要删除结点的孩子结点。,35,例:删除 33,第4章 树,4.4二叉搜索树,图

12、4.30 具有两个子树的结点删除, 要删除的结点有左、右两棵子树为了保持二叉搜索树的有序性,替代被删除的元素的位置可以有两种选择:一种是取其右子树中的最小元素;另一个是取其左子树中的最大元素。,41,例:删除 41,1、取右子树中的最小元素替代,2、取左子树中的最大元素替代,第4章 树,4.5 平衡二叉树,二叉树排序树性能,例不同的插入次序,将导致不同的深度和平均查找长度ASL。 (a) 按一月到十二月的自然月份序列输入所生成的; (b) 输入序列为(July, Feb, May, Mar, Aug, Jan, Apr, Jun, Oct, Sept, Nov, Dec) (c) 输入序列则是

13、按月份字符串从小到大的顺序排列的。,查找二叉搜索树(BST)的时间复杂度(最坏情况下)用查找过程中的比较次数来衡量,它取决于树的深度。,第4章 树,4.5 平衡二叉树, 按ASL的定义,可以分别计算出三棵二叉搜索树的平均查找长度: ASL(a)=(1+22+33+43+52+61)/12 = 3.5; ASL(b)=(1+22+34+45)/12 = 3.0; ASL(c)=(1+21+31+41+51+61+71+81+91+101+111+121)/12 = 6.5;,对于一棵具有n个结点的树来说,其二叉排序树的形态对于查找效率至关重要,或者说,一棵二叉排序树不一定就能提高查找的速度,而是

14、要看这棵树的形态。,思考:如何构造形态“好”的二叉树?,第4章 树,4.5 平衡二叉树, 平衡二叉树的定义,第4章 树,4.5 平衡二叉树,【定义】对于二叉树中任一结点T,其“平衡因子(Balance Factor,简称BF)”定义为BF(T) = hL-hR,其中hL和hR分别为T的左、右子树的高度。,“平衡二叉树(Balanced Binary Tree)”又称为“AVL树” 。 AVL树或者是一棵空树,或者是具有下列性质的非空二叉搜索树: “任一结点左、右子树高度差的绝对值不超过1。”即|BF(T) | 1。,Mar,1,May,Nov,1,2,首个不平衡的“发现者”是Mar(未必是根结

15、点),它是调整起点位置。而“麻烦结点”Nov 在发现者右子树的右边,因而叫 RR 插入,需要RR 旋转(右单旋);一般情况(设A是首个发现者)的调整方式如下:,0, 平衡二叉树的调整,第4章 树,4.5 AVL树,Aug,Apr,1,2,2, 首个“发现者”是Mar; “麻烦结点”Apr 在发现者左子树的左边,因而叫 LL 插入;一般情况(设A是首个发现者)的调整方式如下:,0,第4章 树,4.5 AVL树,Jan,1,1,2,首个“发现者”是May; “麻烦结点”Jan在左子树的右边,因而叫 LR 插入;一般情况(设A是首个发现者)的调整如下:,左-右双旋,第4章 树,4.5 AVL树,De

16、c,July,Feb,1,1,2,2,一般情况调整如下:,第4章 树,4.5 AVL树,右-左双旋,June,Oct,Sept,1,1,1,2,1,2,1,1,1,1,1,1,注意:有时候插入元素即便 不需要调整结构,也可能需要重新计算 一些平衡因子。,第4章 树,4.5 AVL树,LL、RR、LR、RL四种不平衡情况及其它们的旋转调整算法程序,见教材p.131代码4.20-代码4.22,最后一个问题: 查找和插入的时间复杂性 Tp = O( h ) 其中 h 是二叉树的高度, 但是, h = ?,第4章 树,4.5 AVL树,设 nh 高度为h的平衡二叉树的最小结点数. 二叉树看起来应该是如下结构形式:,斐波那契序列: F0 =

温馨提示

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

评论

0/150

提交评论