`
huntfor
  • 浏览: 201324 次
  • 性别: 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
分享到:
评论

相关推荐

    2015广工数据结构实验--平衡二叉树(包含源码和实验报告

    平衡二叉树(Balanced Binary Tree)是数据结构中的一个重要概念,尤其在算法设计和数据库系统中发挥着关键作用。本实验是针对广东工业大学(简称“广工”)学生的一次数据结构课程实践,旨在让学生深入理解平衡...

    数据结构平衡二叉树课程设计

    在这个“数据结构平衡二叉树课程设计”中,我们重点探讨了如何使用C语言实现平衡二叉树,并包含了课程设计报告和多种输出格式的展示。 平衡二叉树(Balanced Binary Tree)是一种特殊的二叉树,它的左右子树的高度...

    广工数据结构实验——平衡二叉树

    本实验“广工数据结构实验——平衡二叉树”着重探讨了一种特殊类型的数据结构,即平衡二叉树。平衡二叉树是二叉搜索树(Binary Search Tree, BST)的一个变体,它通过保持树的高度平衡来确保查找、插入和删除操作的...

    数据结构平衡二叉树的操作演示

    数据结构平衡二叉树的操作演示 本篇文章将对平衡二叉树的操作演示进行详细的介绍,包括创建表、查找、插入、删除、合并、分裂六种操作。并对平衡二叉树的实现过程进行了详细的设计和分析。 一、概要设计 平衡...

    广工数据结构课程设计(平衡二叉树的演示)

    在广工数据结构课程设计中,平衡二叉树是一个重要的学习主题。平衡二叉树,又称自平衡查找树,是一种特殊的二叉树数据结构,它保持了数据的平衡分布,确保了查找、插入和删除等操作的时间复杂度尽可能低,通常为O...

    数据结构 课程设计 平衡二叉树的生成设计

    平衡二叉树是一种特殊的二叉树数据结构,它的左右两个子树的高度差不超过1,并且每个节点的两个子树都是平衡二叉树。这种特性使得平衡二叉树在插入、删除和搜索等操作上的性能比普通二叉树更为优秀,接近于最理想的...

    合工大数据结构实验 二叉树

    - **二叉树的平衡**:通过旋转操作(如LL旋转、RR旋转、LR旋转、RL旋转)保持平衡二叉树的性质,以优化查找效率。 在合工大的这个实验中,学生可能需要实现上述操作,理解它们的逻辑,并通过编写代码来实现。此外,...

    平衡二叉树数据结构课程设计

    平衡二叉树是一种特殊的二叉树数据结构,它在保持二叉查找树特性的同时,通过特定的结构调整策略,确保了树的高度平衡。这样的设计使得在平衡二叉树中执行插入、删除和查找等操作的时间复杂度可以保持为O(log n),...

    数据结构之平衡二叉树的递归实现

    平衡二叉树(AVL树)是数据结构中的一个重要概念,它是一种自平衡的二叉搜索树,确保了任何节点的两个子树的高度差不超过1。这使得AVL树在查找、插入和删除操作上具有较高的效率。本文将深入探讨平衡二叉树的递归...

    数据结构课程设计--平衡二叉树的动态演示

    在IT领域,数据结构是计算机科学的基础,而平衡二叉树是其中一个重要概念。平衡二叉树(Balanced Binary Tree)是一种特殊的二叉树结构,它保持了树的高度平衡,从而确保了数据的查找、插入和删除操作具有较高的效率...

    平衡二叉树(纯C++实现)

    平衡二叉树是一种特殊的二叉树数据结构,其特性是左右子树的高度差不超过1,这使得在平衡二叉树中的查找、插入和删除操作的时间复杂度都能保持在O(log n)级别,大大提高了效率。在本项目中,我们将探讨如何使用C++...

    数据结构平衡二叉树.ppt

    平衡二叉树是一种特殊类型的二叉查找树,其...理解并掌握这些旋转方法对于正确实现和优化平衡二叉树至关重要,这不仅有助于提高数据结构的性能,也对于理解和设计其他高级数据结构如红黑树、B树等有着基础性的作用。

    数据结构之平衡二叉树的非递归实现

    在IT领域,数据结构是计算机科学的基础,而平衡二叉树是其中的一种重要结构,它在数据查询、插入和删除操作中保持了较高的效率。本文将深入探讨如何使用C语言实现平衡二叉树的非递归版本,以提高程序执行性能。 ...

    数据结构课程设计——平衡二叉树的实现

    在数据结构课程设计中,平衡二叉树的实现是一个重要的实践环节,旨在加深对数据结构和算法的理解。平衡二叉树是一种特殊的二叉树,它确保了任何节点的两个子树的高度差不超过1,从而保证了操作如查找、插入和删除的...

    平衡二叉树的程序源代码

    平衡二叉树是一种特殊的二叉树数据结构,它在保持二叉查找树特性的同时,通过特定的调整策略确保了左右子树的高度差不超过1,从而优化了查找、插入和删除等操作的时间复杂度,通常为O(log n)。在本程序源代码中,...

    生成平衡二叉树.cpp_C++_二叉树_数据结构_

    这个过程不仅加深了对二叉树和平衡二叉树的理解,还展示了C++在处理数据结构和算法时的强大能力。在实际编程中,类似的方法也可以应用于其他平衡二叉树类型,比如AVL树或红黑树,只需稍作调整以适应特定树的旋转规则...

    平衡二叉树的实现广工数据结构课设源码加报告

    平衡二叉树是数据结构中的一个重要类型,它是一种特殊的二叉树,能够保持左右子树的高度差不超过1,从而确保了搜索、插入和删除等操作的时间复杂度为O(log n)。在这个广工(广东工业大学)数据结构课程设计中,学生...

    哈希表和平衡二叉树数据结构C语言

    哈希表和平衡二叉树是两种在计算机科学中广泛使用的数据结构,它们在存储和检索数据时具有各自的优势。本项目将这两种数据结构用C语言实现,旨在帮助学习者深入理解它们的工作原理以及如何在实际编程中应用。 首先...

    03平衡二叉树_AVLTree.rar_03平衡二叉树_AVLTree_大话数据结构_平衡二叉树

    在数据结构的学习中,理解并掌握AVL树的概念、特性以及操作是至关重要的。 平衡二叉树的概念: 平衡二叉树的主要目标是解决普通二叉搜索树可能产生的高度不平衡问题,以提高查找、插入和删除操作的效率。在AVL树中...

    平衡二叉树实现学生成绩管理

    平衡二叉树(Balanced Binary Tree)是一种特殊类型的数据结构,它在保持二叉搜索树特性的同时,通过特定的结构调整策略确保了树的高度平衡,从而提高了查询、插入和删除等操作的效率。本项目“平衡二叉树实现学生...

Global site tag (gtag.js) - Google Analytics