7蛤蟆的数据结构进阶七平衡二叉树.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
7蛤蟆的数据结构进阶七平衡二叉树

7. 蛤蟆的数据结构进阶七平衡二叉树本地名言:“金钱的贪求(这个毛病,目前我们大家都犯得很凶)和享乐的贪求,促使我们成为它们的奴隶,也可以说,把我们整个身心投入深渊。唯利是图,是一种痼疾,使人卑鄙,但贪求享乐,更是一种使人极端无耻,不可救药的毛病。 -- 郎加纳斯”我们来看下传说中的平衡二叉树,为什么说他传说中呢?因为蛤蟆接触ORACLE数据库比较多,而ORACLE数据中用到最多的索引就是平衡二叉树,所以嘛。平衡二叉树平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。构造与调整方法平衡二叉树的常用算法有红黑树、AVL、Treap等。最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。代码实现main输入1进行调用CreatBST函数来创建平衡二叉树,输入2 调用SearchBST函数进行查找,输入3调用InsertAVL函数进行插入,输入4调用DeleteAVL进行删除,输入5退出。输入其他则提出输入错误,请重新选择。简单图1示如下R_Rotate(BSTree p) //对以*p为根的二叉排序树作右旋处理L_Rotate(BSTree p) //对以*p为根的二叉排序树作左旋处理LeftBalance(BSTree T)该函数实现对以指针T所指结点为根的二叉树作左平衡旋转处理输入的那个节点的平衡度为1,但是又再其左边插入了一个节点,使失去了平衡。获得该节点的子节点。判断该子节点的平衡度。如果子节点平衡度为1则,将该节点和子节点的平衡度设置为0,然后调用R_Rotate函数进行单向右旋处理(LL型)。如果子节点平衡度为-1则,先进行左旋,然后右旋处理(双向旋转 LR型)。R_Rotate为根的二叉排序树作右旋处理。L_Rotate为根的二叉排序树作左旋处理。RightBalance(BSTree T)//对以指针T所指结点为根的二叉树作右平衡旋转处理同LeftBalance函数。有两种类型。(RR型和RL型)。InsertAVL(BSTree T,int e,bool taller)如果为空,则创建节点,插入成功。如果不为空,则判断是否在平衡二叉树中已经存在。如果存在则设置taller=false.然后退出返回0。如果再平衡二叉树中不存在,则判断插入的值与根节点大小,如果小于则递归调用InsertAVL函数从左节点开始,如果大于则递归调用InsertAVL函数从右节点插入。(最后是肯定要一个为空的节点上进行插入的,不存在替换的情况,如果替换说明相等,但是相等时不会插入的)如果插入成功,则设置taller为true,然后计算平衡度。平衡度是倒退。在左子节点插入后,判断当前该节点的平衡值,如果之前是LH,说明原本是左边高现在又往左边插入,需要调用leftbalance函数进行处理。其他情况类似,如果再在右子节点插入后,判断当前该节点的平衡值,如果之前是RH,说明原本是右边高现在又往右边插入,也需要调用RightBalance函数进行处理SearchBST(BSTree T,int key)该函数用户查找元素key是否在树T中存在则返回,否则判断是否递归进行左子树后者右子树查询。CreatBST(BSTree T)以输入-1为二叉树建立的结束。然后调用InsertAVL函数插入到平衡二叉树中。LeftBalance_div(BSTree p,int shorter)//删除结点时左平衡旋转处理RightBalance_div(BSTree p,int shorter)//删除结点时右平衡旋转处理Delete(BSTree q,BSTree r,int shorter)//删除结点如果删除节点的右子节点的右子节点为空,则直接将右子节点提升上来,将右子节点的的左子节点放置到之前右子节点的位置即可。如果删除节点的右子节点的右子节点不为空,则递归调用Delete函数,然后调用RightBalance_div。DeleteAVL(BSTree p,int x,int shorter)对平衡二叉树的删除操作。如果删除点的右子树为空,则直接重接它的左子树即可。如果左子树为空个,则重接它的右子树即可。如果都不为空,则调用Delete函数。最后调用LeftBalance_div。如果本次没找到则进行即可查找。PrintBST该函数用于输出二叉树。递归调用进行输出。源码#includestdio.h#includemalloc.h#includes

文档评论(0)

haocen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档