搜索树-2导论.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * R1型不平衡 * * R-1型不平衡 * * R-1型不平衡 * * * * * * AVL树的高度 设在新结点插入前AVL树的高度为 h,结点个数为 n,则插入一个新结点的时间是O(h)。对于AVL树来说,h 多大? 设 Nh 是高度为 h 的AVL树的最小结点数。根的一棵子树的高度为 h-1,另一棵子树的高度为 h-2,这两棵子树也是高度平衡的。因此有 N0 = 0 (空树) N1 = 1 (仅有根结点) Nh = Nh-1 + Nh-2 +1 , h 1 可以证明,对于 h ? 0,有 Nh = Fh+2 -1 成立。 * * 有 n 个结点的AVL树的高度不超过 在AVL树删除一个结点并做平衡化旋转所需时间为 O(log2n)。 * * 作业 按照12个月份的字典顺序,构建二叉搜索树和avl搜索树 * * 如果节点X不存在,那么从根节点至新插入节点途中经过的所有节点在插入前的平衡因子值都是0。 由于插入操作只会使平衡因子增/减-1,0或1,并且只有从根节点至新插入节点途中经过的节点的平衡因子值才会被改变,所以插入后,树的平衡不会被破坏。 因此,如果插入后的树是不平衡的,那么X就一定存在。 观察 * * 如果插入后bf(X)=0,那么以X为根节点的子树的高度在插入前后是相同的。 观察 * * 例如,如果插入前的高度是h,且bf(X)为1,那么,在插入前,X的左子树的高度XL是h-1,右子树的高度XR是h-2。由于平衡因子变为0,所以必须在XR中作插入,得到高度为h-1的新子树X‘R。 由于从X到新插入节点途中遇到的所有节点在插入前的平衡因子均为0,所以XR的高度必须增加到h-1。 X的高度仍保持为h,X的祖先的平衡因子在插入前后保持相同,所以树的平衡被保持住了。 观察 * * 使树的平衡遭到破坏的唯一一种情形是插入过程使得平衡因子bf(X)的值由-1变为-2,或者由1变为2。 观察 * * 观察结果 右单旋转 左单旋转 左右双旋转 右左双旋转 * * 当节点A已经被确定时,A的不平衡性可归类为L型不平衡(新插入节点在A的左子树中)或R型不平衡。 通过确定A的哪一个孙节点在通往新插入节点的路径上,可以进一步细分不平衡类型。 根据上述细分不平衡类型的方法,A节点的不平衡类型将是LL(新插入节点在A节点的左子树的左子树中),LR(新插入节点在A节点的左子树的右子树中),RR和RL四种类型中的一种。 结论 * * LL型不平衡 * * 原来以A为根节点的子树,现在以B为根节点,B‘L仍然是B的左子树,A变成B的右子树,BR变成A的左子树,A的右子树不变。 由于A的平衡因子改变了,所以处于从B到新插入节点途中的B‘的所有节点的平衡因子都将改变,其他节点的平衡因子与旋转前保持一致。 图11-8中a和c子树的高度是一样的,所以,子树的祖父节点的平衡因子与插入前是一样的。因此不再有平衡因子不是-1,0或1的节点。一个LL旋转就已经使整个树重新获得平衡! LL型旋转 * * template class Type void AVLTreeType:: RotateRight ( AVLNodeType *Tree, AVLNodeType * NewTree) { //右单旋转的算法 NewTree = Tree→left; Tree→left = NewTree→right; NewTree→right = Tree; } * * RR型旋转 h h h A C E B D (a) (b) (c) h h h + 1 B A C E D h h h + 1 C E A B D 如果在子树E中插入一个新结点,该子树高度增1导致结点A的平衡因子变成-2,出现不平衡。 沿插入路径检查三个结点A、C和E。它们处于一条方向为“\”的直线上,需要做左单旋转。 以结点C为旋转轴,让结点A反时针旋转。 -1 -2 0 -1 0 0 * * template class Type void AVLTreeType :: RotateLeft ( AVLNodeType *Tree, AVLNodeType * NewTree ) { //左单旋转的算法 NewTree = Tree→right; Tree→right = NewTree→left; NewTree→left = Tree; }

文档评论(0)

2226657222 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档