`
huntfor
  • 浏览: 195135 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[数据结构]平衡二叉树的旋转

阅读更多

平衡二叉树(Balanced binary tree)是由Adelson-velskii 和Landis于1962年提出的,所以又称为AVL树。

先来看定义:

1. 它是一颗空树,或者:2、3
2. 它的左右两个子树的高度差的绝对值不超过1
3. 左右两个子树都是一棵平衡二叉树

 相关该概念:

平衡因子 = 左子树高 - 右子树高(只能是-1,0,1,绝对值超过1,则不满足平衡二叉树的性质)

 其实根据AVL的定义来看,貌似AVL树和二叉排序树并没有太大的关系,二叉排序树并不要求平衡,而平衡树也没有要求有序。

 

但是考虑一颗二叉排序树,我们总是期望树的高度是最低的,即logN,这样当我们进行搜索的时候才能保证高效,但是当我们对一个递增序列进行排序时,会发现BST已经退化成了一个链表,查找事件也退化到了O(n)。因此我们总希望排序二叉树是保持平衡的,从而能达到查找效率的高效化,AVL树就是诞生在这种需求之下的。

因此很多教材上将AVL树定义在BST树的基础之上,也是不无道理的。有人AVL树将其称为平衡二叉排序树。

 

下图所示为AVL树和非平衡树:

 

AVL树相关算法:

 

平衡二叉树的建立:

AVL树的建立过程和二叉排序树是一样的,也是将关键字逐个插入到空树中的过程,不同的是,建立AVL树的过程,对于每一个插入操作都要进行检查,看是否新关键字的插入而导致原AVL树失去平衡,如果失衡,就要进行平衡调整。

 

平衡调整:

假设向AVL中插入一个新节点破坏了平衡,首先要找出插入新节点后失去平衡的最小子树,然后再调整这个子树。值得注意的是:当失去平衡的最小子树被调整为AVL树之后,其他所有的不平衡子树无需调整,整个AVL树就会成为一颗AVL树。

 

这里有个概念:失去平衡的最小子树。所谓的失去平衡的最小子树是以距离插入节点最近,且平衡因子绝对值大于1的节点为根的子树。

 

但是为什么只需要调整失衡的最小子树,其他的都不需要调整就全部平衡了呢?

比如说节点A,有两个子节点B、C,其中插入新节点之后,C节点失去平衡,这时受影响的只可能是C的祖先节点。假设插入新节点之前A的平衡因子是0,则C失衡后,A并不失衡,所以只调整C即可。同理,当A的平衡因子是1,也不影响A的平衡性。当A的平衡因子是-1时,C失衡后,A的平衡因子变成了-2,但是经过调整,C的高度势必会减1,则A的平衡因子又变成了-1,证毕。

 

 

AVL树的调整主要有以下四种:(AVL树的调整部分摘自网络资源)

PS:这里的L、R是指插入节点位于失衡父节点的位置。比如LL表示插入节点在失衡节点的左子树的左子树上。同理,RL指插入节点在失衡节点的右子树的左子树上。以此类推。

1) LL调整

由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1增至2而失去平衡。故需进行一次顺时针旋转操作。即将A的左孩子B向右上旋转代替A作为根结点,A向右下旋转成为B的右子树的根结点。而原来B的右子树则变成A的左子树。

 

 

2. RR调整

由于在A的右孩子C 的右子树上插入结点F,使A的平衡因子由-1减至-2而失去平衡。故需进行一次逆时针旋转操作。即将A的右孩子C向左上旋转代替A作为根结点,A向左下旋转成为C的左子树的根结点。而原来C的左子树则变成A的右子树。

 

 

3. LR调整

由于在A的左孩子B的右子数上插入结点F,使A的平衡因子由1增至2而失去平衡。故需进行两次旋转操作(先逆时针,后顺时针)。即先将A结点的左孩子B的右子树的根结点D向左上旋转提升到B结点的位置,然后再把该D结点向右上旋转提升到A结点的位置。即先使之成为LL型,再按LL型处理。 

如图中所示,即先将圆圈部分先调整为平衡树,然后将其以根结点接到A的左子树上,此时成为LL型,再按LL型处理成平衡型。

 

 

4.RL调整

由于在A的右孩子C的左子树上插入结点F,使A的平衡因子由-1减至-2而失去平衡。故需进行两次旋转操作(先顺时针,后逆时针),即先将A结点的右孩子C的左子树的根结点D向右上旋转提升到C结点的位置,然后再把该D结点向左上旋转提升到A结点的位置。即先使之成为RR型,再按RR型处理。

 

如图中所示,即先将圆圈部分先调整为平衡树,然后将其以根结点接到A的左子树上,此时成为RR型,再按RR型处理成平衡型。

 

平衡化靠的是旋转。参与旋转的是3个节点(其中一个可能是外部节点NULL),旋转就是把这3个节点转个位置。注意的是,左旋的时候p->right一定不为空,右旋的时候p->left一定不为空,这是显而易见的。

 

 

如果从空树开始建立,并时刻保持平衡,那么不平衡只会发生在插入删除操作上,而不平衡的标志就是出现bf == 2或者 bf == -2的节点。

 

 

 

删除操作:

AVL树的删除操作主要有以下三种:

以下图为例:

1. 叶节点——直接删除,比如说BEF,可直接删除,并不会影响平衡性。原因很简单,自己想╮(╯_╰)╭

2. 包含一颗子树的节点——比如节点C,直接将其子树的根节点(E)取代它的位置。

3. 包含两颗子树的节点——比如A,D。这种情况看似复杂,其实可以转换成第1或者第2种情况。以D为例,首先找到D的前驱结点F或者后继结点C,将D用F或者C替换掉,再删除F(第一种情况)或者C(第二种情况)。

 

  • 大小: 16.8 KB
  • 大小: 18.4 KB
  • 大小: 16.8 KB
  • 大小: 24.2 KB
  • 大小: 20.9 KB
  • 大小: 6.8 KB
分享到:
评论

相关推荐

    数据结构 平衡二叉树.cpp

    程序输入一个字符串(只包含小写字母),请按照字符的输入顺序建立平衡二叉排序树,并分别输出二叉树的先序序列、中序序列和后序序列,最后输出该二叉树向左旋转 90 度后的结构。 例如:向左旋转 90 度后,以每层向...

    平衡二叉树完整代码(创建,插入,旋转)

    该套代码是博主在学习数据结构的平衡二叉树时总结整理的一套平衡二叉树的代码,包括平衡二叉树的创建,插入,旋转,遍历等一套完善的代码,亲自测试过,代码保证是对的。

    C++数据结构-二叉查找树和平衡二叉树

    实现了二叉查找树的查找、插入...实现了平衡二叉树(AVL树)的查找、插入、删除和迭代遍历的完整功能,插入时的各种旋转操作按照经典数据结构教材实现,并有详细的注释和说明。删除操作和相关旋转方法有单独描述文档。

    平衡二叉树的构造过程教程

    详细介绍平衡二叉树的构造过程,各节点的插入以及不平衡树的旋转

    二叉排序树和平衡二叉树的实现(vc++)

    以二叉链表作为二叉树的存储结构,系统实现功能: 1 输入元素序列L,以回车(‘\n’)为输入结束标志,分别生成一棵二叉排序树T和平衡的二叉排序树BT ; 2 对二叉排序树T作中序遍历,输出结果; 3 在BT上插入元素x,当BT...

    二叉排序树与平衡二叉树的实现

    (5)计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后的平衡二叉树中是否存在平衡因子大于1的结点。 2 方案设计 2.1 模块功能 1.建立二叉树:要求以回车('\n')...

    java 实现平衡二叉树

    文档中是我自己实现的用java语言实现(1)判断给定的二叉树是否平衡;(2)二叉树插入新数据后,如果失衡自我旋转调整的方法。

    精心整理史上最全的数据结构flash演示动画,共5个版本,祝大家考研成功!

    \数据结构flash演示\版本1\9-3-8平衡二叉树的旋转.swf \数据结构flash演示\版本1\9-4-1哈希表-线性探测再散列.swf \数据结构flash演示\版本1\9-4-2哈希表-链地址法.swf \数据结构flash演示\版本1\9-4-3哈希表-...

    BUC.zip_BUC算法实现_buc 算法_buc算法_二叉树旋转_平衡树

    BUC算法,数据库一种重要的查询算法。利用AVL平衡树,是一种很有效率二叉搜索树,利用它可以的旋转功能可以很方便的构造,很快的查找 数据结构

    平衡二叉树

    程序输入一个字符串(只包含小写字母),请按照字符的输入顺序建立平衡二叉排序树,并分别输出二叉树的先序序列、中序序列和后序序列,最后输出该二叉树向左旋转 90 度后的结构。

    C语言数据结构之平衡二叉树(AVL树)实现方法示例

    本文实例讲述了C语言数据结构之平衡二叉树(AVL树)实现方法。分享给大家供大家参考,具体如下: AVL树是每个结点的左子树和右子树的高度最多差1的二叉查找树。 要维持这个树,必须在插入和删除的时候都检测是否出现...

    C语言数据结构和排序查找算法程序

    数据结构包括:栈,队列,两个队列实现一个栈,两个栈实现一个队列,二叉树的创建,添加,平衡二叉树天界旋转等,红黑树,创建,添加节点,删除节点,调整。算法包括:10个排序(冒泡,插入,选择,快排,归并,桶排...

    数据结构第九章 查找作业及答案(100分).docx

    8. 设输入序列为{20,11,12,…},构造一棵平衡二叉树,当插入值为12的结点时发生了不平衡,则应该进行的平衡旋转是( )。 A. LL B. LR C. RL D. RR 二、填空题(每空3分,共24分)。 1.在有序表A[1..18]中,采用二分...

    AVL树数据结构平衡二叉查找树

    增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文《An algorithm for the organization of information》中发表了它。

    二叉树排序树建立及平衡处理

    1本程序在vc++6.0编译...拆分两棵平衡二叉树 } (2)存储结构的定义: typedef struct BSTNode { TElemType data; int bf; //结点的平衡因子 struct BSTNode *lchild, *rchild;//左.右孩子指针 }BSTNode, *BSTree;

    Java数据结构和算法中文第二版(1)

    Java数据结构和算法中文第二版(1) Java数据结构和算法中文第二版(2) 【内容简介】 本书可帮助读者: 通过由基于JAVA的演示所组成的可视专题讨论来掌握数据结构和算法 学会如何为常见和不太常见的编程条件选择...

    天津科技大学数据结构模拟试题

    1、当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取... 7、在AVL树中,由于在A结点的右孩子的右子树上插入结点,使A结点的平衡因子由-1变为-2,使其失去平衡,应采用 型平衡旋转。

    数据结构演示软件

    数据结构算法演示(Windows版) 使 用 手 册 一、 功能简介 本课件是一个动态演示数据结构算法执行过程的辅助教学软件, 它可适应读者对算法的输入数据和过程执行的控制方式的不同需求, 在计算机的屏幕上显示算法...

    数据结构与算法全集(C源代码+详细注释)

    │ ├─平衡二叉树(二叉排序树的平衡旋转生成) │ │ 1.txt │ │ BBSTree.cpp │ │ BBSTree.h │ │ BiTree.cpp │ │ BiTree.h │ │ DElemType.cpp │ │ DElemType.h │ │ DSTable.cpp │ │ DSTable.h │ ...

    用c描述的数据结构演示软件

    数据结构算法演示(Windows版) 使 用 手 册 一、 功能简介 本课件是一个动态演示数据结构算法执行过程的辅助教学软件, 它可适应读者对算法的输入数据和过程执行的控制方式的不同需求, 在计算机的屏幕上显示算法执行...

Global site tag (gtag.js) - Google Analytics