版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、南京邮电大学计算机学院 2007年1月,数据结构,Data Structures in C+,南京邮电大学计算机学院 2007年1月,第7章 动态集和搜索树,南京邮电大学计算机学院 2007年1月,7.1 二叉搜索树 7.2 二叉平衡树 7.3 B-树,南京邮电大学计算机学院 2007年1月,7.1 二叉搜索树,南京邮电大学计算机学院 2007年1月,7.1.1 二叉搜索树的定义,定义7.1 设结点由关键字值表征,假定所有结点的关键字值各不相同,二叉搜索树或者是一棵空二叉树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的关键字值均小于根结点的关键字值; (2)若右子树不
2、空,则右子树上所有结点的关键字值均大于根结点的关键字值; (3)左、右子树也分别是二叉搜索树。,南京邮电大学计算机学院 2007年1月,性质7.1 若以中序遍历一棵二叉搜索树,将得到一个以关键字值递增排列的有序序列。,例:,对图7.1所示二叉搜索树,按中序遍历后得到的序列为:23、35、45、54、63、69、76、87,二叉搜索树也称二叉排序树,南京邮电大学计算机学院 2007年1月,二叉搜索树类 template class BSTree:public DynamicSet public: BSTree()root=NULL; ResultCode Search(T,南京邮电大学计算机学院
3、 2007年1月,7.1.2 二叉搜索树的搜索,二叉搜索树搜索递归算法 template ResultCode BSTree:Search(T ,南京邮电大学计算机学院 2007年1月,template ResultCode BSTree:Search(BTNode *p, T ,南京邮电大学计算机学院 2007年1月,二叉搜索树搜索迭代算法 template ResultCode BSTree:Search(T ,南京邮电大学计算机学院 2007年1月,7.1.3 二叉搜索树的插入,二叉搜索树的插入步骤与单链表的插入步骤类似。 (1) 查找插入元素的位置; (2) 生成新结点; (3) 插入
4、新结点(有可能修改root指针),南京邮电大学计算机学院 2007年1月,在二叉搜索树上插入一个新元素,首先应搜索新元素的插入位置。搜索方法与Search函数的做法类似,但需要在自根结点相下搜索过程中,记录下当前结点的双亲结点,使得最终得到新结点的双亲结点q。 如果二叉树中有重复元素,应返回Duplicate。 搜索到达空子树,则表明树中不包含重复元素。 此时,算法构造一个新结点p存放新元素x,连至结点q,成为q的孩子。至于p是q的左孩子还是右孩子,这取决于x与q关键字值的大小。 如果原二叉搜索树是空树,则新结点p成为新二叉搜索树的根。,南京邮电大学计算机学院 2007年1月,在二叉搜索树中插
5、入43的执行过程:,43,q=,43,p=,南京邮电大学计算机学院 2007年1月,二叉搜索树的插入,template ResultCode BSTree:Insert(T ,查找插入位置,南京邮电大学计算机学院 2007年1月,p=new BTNode(x); if(!root) root=p; else if(xelement) q-lChild=p; else q-rChild=p; return Success; ,生成新结点,插入新结点,南京邮电大学计算机学院 2007年1月,在二叉搜索树中插入43的执行过程:,南京邮电大学计算机学院 2007年1月,21,36,33,43,25,2
6、8,下图显示了从空树开始通过依次插入元素,构造一棵二叉搜索树的过程。,(a)空树,(b)插入28,(c)插入21,(d)插入25,(e)插入36,(f)插入33,(g)插入43,南京邮电大学计算机学院 2007年1月,7.1.4 二叉搜索树的删除,在二叉搜索树上删除一个结点也很容易。与插入运算类似,应先搜索被删除结点p,并记录p的双亲结点q。,南京邮电大学计算机学院 2007年1月,7.1.4 二叉搜索树的删除,若结点*p有两棵非空子树 需搜索*p的中序遍历次序下的直接后继(或直接前驱)结点,设为*s,将*s的值复制到*p中,称为替代,因为*s最多只有一棵非空子树,这样一来,问题转化为“被删除
7、的结点最多只有一棵非空子树”的情形。,如果不存在指定删除的元素,应返回NotPresent。 删除结点p的操作由下列几步组成:,南京邮电大学计算机学院 2007年1月,若结点*p 只有一棵非空子树或*p是叶子 以*p的惟一孩子(设为*c)或空子树(cNULL)取代*p,链接至*p的双亲结点*q。 若被删除的结点*p是根结点,则删除后,结点*c成为新的根;若*p是其双亲*q的左孩子,则*c也应成为*q的左孩子,否则*c成为*q的右孩子。最后释放结点*p所占用的空间。,南京邮电大学计算机学院 2007年1月,删除28,二叉搜索树上删除元素,南京邮电大学计算机学院 2007年1月,29,28,下图结
8、合程序,演示删除一个有左右孩子结点的过程。,28,25,36,43,32,30,例如删除28,34,q=,x=,29,南京邮电大学计算机学院 2007年1月,南京邮电大学计算机学院 2007年1月,template ResultCode BSTree:Remove(T,搜索要删除的结点,28,21,36,33,43,25,23,35,34,21,南京邮电大学计算机学院 2007年1月,if (p-lChild ,转化为被删除的结点 p 最多只有一个孩子,/替代,/删除结点,南京邮电大学计算机学院 2007年1月,7.1.5 平均情况时间分析,二叉搜索树搜索的平均时间为O(log2n)。 最坏情
9、况搜索时间为O(n)。,南京邮电大学计算机学院 2007年1月,二叉搜索树搜索算法分析,最好情况和一般情况:O(log2n) 最坏情况:单支树,O(n),输入:28,21,36,25,33,35,43.,南京邮电大学计算机学院 2007年1月,7.2 二叉平衡树,集合可以用二叉平衡树表示。是一种特殊的二叉搜索树,它能有效地控制树的高度,避免产生普通搜索树的“退化”树形。 注: 只介绍二叉平衡树的插入,不介绍二叉平衡树的删除。,南京邮电大学计算机学院 2007年1月,7.2.1 二叉平衡树的定义,定义7.2 二叉平衡树又称AVL树 它或者是一棵空二叉树,或者是具有下列性质的二叉树: (1)其根的
10、左、右子树高度之差的绝对值不超过1; (2)其根的左、右子树都是二叉平衡树。 结点的平衡因子定义为该结点的左子树的高度减去右子树的高度。 AVL二叉搜索树既是二叉搜索树又是AVL树。在下面的讨论中,二叉平衡树(AVL树)是指AVL二叉搜索树。,南京邮电大学计算机学院 2007年1月,二叉平衡树的例子,AVL搜索树 既是二叉搜索树又是AVL树。(具有平衡性和排序性)。 在下面的讨论中,二叉平衡树(AVL树)是指AVL搜索树。,南京邮电大学计算机学院 2007年1月,7.2.2 二叉平衡树类,template struct AVLNode AVLNode(const T,AVL树可以采用普通二叉树
11、的二叉链表存储,为了简化插入和删除操作,为每个结点增加一个平衡因子。,南京邮电大学计算机学院 2007年1月,template 二叉平衡树可用于实现动态集。 class AVLTree:public DynamicSet /定义动态集的派生类 public: AVLTree( )root=NULL; ResultCode Search(T ,二叉平衡树的搜索和一般二叉树的搜索一样。下面介绍插入.,南京邮电大学计算机学院 2007年1月,private: AVLNode* root; ResultCode Insert(AVLNode* ,南京邮电大学计算机学院 2007年1月,7.2.3 二叉
12、平衡树的平衡旋转,二叉平衡树的插入 二叉平衡树的插入可先按普通二叉搜索树的插入方法插入结点。新结点设为q,但插入新结点后的新树可能不再是AVL树,这时需要重新平衡,使之仍具平衡性和排序性。 插入后将影响从根到插入位置的路径上所有结点的平衡因子的值。如果被插入的结点在这条路径上某个结点的左子树上,那么该结点的平衡因子将加1,否则将减1。,南京邮电大学计算机学院 2007年1月,分别插入:25,35,14,44,南京邮电大学计算机学院 2007年1月,插入25:从根到25的路径上,所有结点的平衡因子均为0。插入新元素25后,这棵树仍然是二叉平衡树,但整棵树高度加1。 插入35:从根到35的路径上,
13、36的平衡因子不为0,新元素35被插在36的较矮的子树上。插入后,该树仍然是二叉平衡树。,南京邮电大学计算机学院 2007年1月,插入14:从根到14的路径上,12的平衡因子不为0,新元素14被插在12的较高的子树上,即14被插在12的右子树的左子树上,插入后,该树不再是二叉平衡树。 插入44:从根到44的路径上,43和56的平衡因子都不为0,其中56是离44最近的,平衡因子值不为零的结点。新元素44被插在56的较高的那棵子树上,即44被插在56的左子树的左子树上。插入后,该树不再是二叉平衡树。,南京邮电大学计算机学院 2007年1月,图中4个元素的插入分别代表4种不同情况: (1)插入25
14、树仍然是二叉平衡树,树高度加1 (2)插入35 树仍然是二叉平衡树 (3)插入14 树不再是二叉平衡树 (4)插入44 树不再是二叉平衡树 一般情况,插入新结点后会影响从根结点到新结点的路径上所有结点的平衡因子。插入在某结点的左子树上,该结点的平衡因子+1,插入在某结点的右子树上,该结点的平衡因子-1,,南京邮电大学计算机学院 2007年1月,重新平衡(假定新结点*q插在结点*s的左子树上的情况) 如果从根结点到插入位置的路径上所有结点的平衡因子均为0,那么插入后这棵树仍然是二叉平衡树,而高度加1。 如果在这条路径上,某个结点的平衡因子不为0,但自它以下直至插入位置的所有结点的平衡因子都为0,
15、则以该结点为根的子树将是有可能不平衡的最小子树s。重新平衡的范围局限于该子树。 为讨论插入算法,作以下假定: (1)结点s是新插入结点q的具有非零平衡因子值(插入前的值)的最近的祖先。 (2)新结点q已插在结点s的左子树上。 (3)从结点s到新结点q的路径上所有结点(不含s)的平衡因子值均已修正。,南京邮电大学计算机学院 2007年1月,我们只涉及新结点q插在结点s的左子树上的情况,其对偶(右子树上)的情况一样。 情况一 若插入前,从根结点到新结点q的插入位置的路径上,所有结点的平衡因子值均为0,插入q后,只需将根结点的平衡因子改为1,并且AVL树的高度加1,插入操作完成。,南京邮电大学计算机
16、学院 2007年1月,情况二 若新结点q插在结点s较矮的子树上(s的平衡因子bF为-1,并假定q插在s的左子树上),则插入后只需令s的平衡因子bF为0,插入算法终止。,南京邮电大学计算机学院 2007年1月,情况三: 插在较高的子树上(s-bF=+1) LL-旋转(r-bF=+1) 新结点q插在s的较高的子树上。这时又可分为两种不同情况: a)情况3a: LL-旋转(r-bF=1) 新结点插在结点s的左子树的左子树上,南京邮电大学计算机学院 2007年1月,南京邮电大学计算机学院 2007年1月,新结点插在结点s的左子树的左子树上,这时有s-bf为1且r-bf为1。 重新平衡的操作及对平衡因子
17、的修正如下。 r=s-lchild; if (r-bf=1) s-lchild=r-rchild; r-rchild=s; r-bf=s-bf=0; ,南京邮电大学计算机学院 2007年1月,b)情况3b: LR-旋转(r-b=-1) 新结点插在结点s的左子树的右子树上,这时有s-b=+1且r-b=-1。重新平衡的操作如下。 1)r=s-lchild; 2)u=r-rchild; 3)r-rchild=u-lchild;4)u-lchild=r; 5)s-lchild=u-rchild;6)u-rchild=s;,南京邮电大学计算机学院 2007年1月,LR-旋转(r-bF=-1),南京邮电大
18、学计算机学院 2007年1月,新结点插在结点s的左子树的右子树上,这时有s-b=+1且r-b=-1。重新平衡的操作如下。 r=s-lchild; u=r-rchild; r-rchild=u-lchild; u-lchild=r; s-lchild=u-rchild; u-rchild=s;,根据u的平衡因子的值分三种情况修正s,r平衡因子,南京邮电大学计算机学院 2007年1月,switch(u-bF) case 1:s-bF=-1;r-bF=0;break; case 0:s-bF=r-bF=0;break; case -1:s-bF=0;r-bF=1; ,南京邮电大学计算机学院 2007
19、年1月,template void AVLTree:LRotation(AVLNode* ,南京邮电大学计算机学院 2007年1月,else / LR旋转 u=r-rChild;r-rChild=u-lChild; u-lChild=r;s-lChild=u-rChild; u-rChild=s; switch(u-bF) case 1:s-bF=-1;r-bF=0;break; case 0:s-bF=r-bF=0;break; case -1:s-bF=0;r-bF=1; s=u; /s指示新子树的根 s-bF=0; /结点s的平衡因子为0 unBalanced=false; /结束重新平
20、衡操作 ,南京邮电大学计算机学院 2007年1月,7.2.4 二叉平衡树的插入,AVL_Insert函数 在集合上定义的Insert函数调用AVL_Insert递归函数,实现在集合中插入元素e,如果是重复元素,则返回false,否则返回true。 AVL_Insert递归函数的执行过程可叙述如下: (1)搜索新元素e的插入位置,并插入之; (2)修正从新结点到结点s的平衡因子; (3)如果是情况一和二,则算法结束,否则调用LRotation或RRotation完成重新平衡以s为根的子树,包括适当修正平衡因子。,南京邮电大学计算机学院 2007年1月,南京邮电大学计算机学院 2007年1月,二叉
21、平衡树的插入 template ResultCode AVLTree:Insert( AVLNode* else,南京邮电大学计算机学院 2007年1月,if (xelement) /新结点插入左子树( 续) result=Insert(p-lChild,x,unBalanced); if (unBalanced) switch (p-bF) case -1:p-bF=0; unBalanced=false;break; case 0:p-bF=1;break; case 1:LRotation(p,unBalanced); else if (x=p-element) /有重复元素 unBal
22、anced=false; x=p-element;result=Duplicate; ,南京邮电大学计算机学院 2007年1月,else /(续) result=Insert(p-rChild,x,unBalanced); if (unBalanced) switch (p-bF) case 1:p-bF=0; unBalanced=false;break; case 0:p-bF=-1;break; case -1:RRotation(p,unBalanced); return result; ,南京邮电大学计算机学院 2007年1月,7.3 B-树,内搜索:当集合足够小,可以驻留在内存中时
23、,相应的搜索方法称为内搜索。 外搜索:如果文件很大,以至于计算机内存容不下时,它们必须存放在外存中。在外存中搜索给定关键字值的元素的方法称为外搜索。 内存中集合用二叉平衡树表示。外存中,集合可以用B-树来表示。,南京邮电大学计算机学院 2007年1月,7.3.1 m叉搜索树,定义7.3 m叉搜索树或者是一棵空树,或者是一棵满足下列特性的树: (1) 根结点最多有m棵子树,并具有如下结构: n,P0,(K1,P1),(K2,P2),(Kn,Pn) 其中,Pi是指向子树的指针,0inm,Ki是元素的关键字值,1i nm; (2) KiKi+1 , 1in;,南京邮电大学计算机学院 2007年1月,
24、(3)子树Pi上所有关键字值都大于Ki,小于Ki+1, 0in; (4)子树P0上所有关键字值都小于K1,子树Pn上的所有关键字值都大于Kn; (5) 子树Pi,0 in也是m叉搜索树。,南京邮电大学计算机学院 2007年1月,南京邮电大学计算机学院 2007年1月,南京邮电大学计算机学院 2007年1月,7.3.2 B-树的定义,定义7.4 一棵m阶B-树是一棵m叉搜索树,它或者是空树,或者是满足下列特性的树: (1)根结点至少有两个孩子; (2)除根结点和失败结点外的所有结点至少有m/2个孩子; (3)所有失败结点均在同一层上。,南京邮电大学计算机学院 2007年1月,南京邮电大学计算机学
25、院 2007年1月,7.3.3 B-树的高度,性质7.2 设B-树失败结点的总数是s,那么,一棵B-树的元素总数N是B-树的失败结点的总数减,即N=s-1。 证明: 每个非失败结点中的包含的元素数目比它所包含的指针数少1(元素=指针-1)。设非失败结点总数为n,则B-树的元素总数N等于所有非失败结点包含的指针总数t减去n,即N=t-n, 而指针总数t等于除根结点以外,失败结点数和非失败结点数的总和,即t = n+s-1。 所以有 n+s-1 = N + n ,整理得N=s-1。,南京邮电大学计算机学院 2007年1月,7.3.3 B-树的高度,定理7.2 有N个元素的m阶B-树的高度是 因:
26、N+12*(m/2)h-1,南京邮电大学计算机学院 2007年1月,7.3.4 B-树的搜索,磁盘访问的次数最多是 1logm/2 (N+1)/2),南京邮电大学计算机学院 2007年1月,7.3.5 B-树的插入,B-树插入新元素的方法 (1) 在B树中搜索给定关键字值的元素,如果搜索成功,表示有重复元素,插入运算失败终止,否则将新元素和一个空指针插入搜索失败处的叶结点中。 (2) 若插入新元素(和一个指针)后,结点*q未溢出,即结点中包含的元素个数未超过m-1(指针数未超过m),则插入运算成功终止。,南京邮电大学计算机学院 2007年1月,(3)若插入新元素(和一个指针后),结点*q已溢出
27、,则必须进行结点的分裂操作,将结点一分为三。分裂发生在位置m/2处。关键字值Km/2之前的元素保留在原来的结点中,在它之后的元素存放在新创建的结点(设地址为q)中,而关键字值为Km/2的元素和地址q 将插入结点*q的双亲结点中。这意味着在该双亲结点中新增了一个元素和一个指针,因此,必须检查此双亲结点的溢出问题。这同样可按(2)和(3)的原则,继续检查和处理该双亲结点。 (4)如果按照(3)的原则,根结点*q产生分裂,根结点没有双亲,那么分裂产生的两个结点的指针q和q以及关键字为Km/2 的元素应组成一个新的根结点,B-树增高一。只要从根结点到新元素插入结点的路径上至少有一个结点未满,B-树不会长高。,南京邮电大学计算机学院 2007年1月,插入59,南京邮电大学计算机学院 2007年1月,插入 53,南京邮电大学计算机学院 2007年1月,7.3.6 B-树的删除,从B-树删除元素的方法 (1)首先搜索被删除的元素,如果不存在被删除的元素,则删除
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度大棚蔬菜种植与农业休闲农业项目合作协议2篇
- 二零二五年度南京市房地产经纪行业劳务派遣及销售服务合同
- 2025年度猪场生物安全防护与防疫物资供应合同4篇
- 二手房地产交易安全保障与监管合同
- 2025年水果采摘与农家乐特色农产品销售合同3篇
- 二零二五年度企业股权激励计划转让合同
- 2025年大数据处理与分析软件服务采购协议3篇
- 二零二五年建筑资质挂靠与工程进度调整服务协议3篇
- 2025年度二手房买卖合同附加物业管理费结算协议3篇
- 二零二五年度大型商业综合体工程分包管理协议2篇
- 四川省高职单招电气技术类《电子基础》历年考试真题试题库(含答案)
- 中级半导体分立器件和集成电路装调工技能鉴定考试题库(含答案)
- 2024年江西生物科技职业学院单招职业技能测试题库带解析答案
- 桥本甲状腺炎-90天治疗方案
- (2024年)安全注射培训课件
- 2024版《建设工程开工、停工、复工安全管理台账表格(流程图、申请表、报审表、考核表、通知单等)》模版
- 部编版《道德与法治》六年级下册教材分析万永霞
- 酒店人防管理制度
- 油田酸化工艺技术
- 上海高考英语词汇手册列表
- 移动商务内容运营(吴洪贵)任务五 其他内容类型的生产
评论
0/150
提交评论