码迷,mamicode.com
首页 > 其他好文 > 详细

AVL树详解

时间:2015-08-10 13:42:54      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

本文引用的链接

平衡二叉树定义

平衡二叉树简称平衡树,又称为AVL树。若一棵二叉树的任何节点的左右子树高度差最多相差1,此二叉树即是平衡二叉树。把二叉树的任何节点的左子树高度减去右子树高度定义为该节点的平衡因子。二叉平衡树的平衡因子只能是1、0或者-1。

平衡二叉树是对二叉搜索树(又称为二叉排序树)的一种改进。二叉搜索树有一个缺点就是,树的结构是无法预料的,随意性很大,它只与节点的值和插入的顺序有关系,往往得到的是一个不平衡的二叉树。在最坏的情况下,可能得到的是一个单支二叉树,其高度和节点数相同,相当于一个单链表,对其正常的时间复杂度有O(logN)变成了O(N),从而丧失了二叉排序树的一些应该有的优点。

当插入一个新的节点的时候,在普通的二叉树中不用考虑树的平衡因子,只要将大于根节点的值插入到右子树,小于节点的值插入到左子树,递归即可。而在平衡二叉树则不一样,在插入节点的时候,如果插入节点之后有一个节点的平衡因子要大于1或者小于-1的时候,需要对其进行调整。

调整二叉树首先要明白一个定义,即最小不平衡子树。最小不平衡子树是指以离插入节点

最近且平衡因子绝对值大于1的节点做根的子树。

平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树,它通过旋转不平衡的节点来使二叉树重新保持平衡,并且查找、插入和删除操作在平均和最坏情况下时间复杂度都是O(log n)

 AVL树的旋转一共有四种情形,注意所有旋转情况都是围绕着使得二叉树不平衡的第一个节点展开的。

由于只有“插入点至根节点”路径上的各节点可能改变平衡状态,因此只要调整其中最深的那个不平衡节点,便可使整棵树重新获得平衡。

调整平衡状态被破坏之各节点中最深的哪一个,便可使整棵树重新获得平衡。假设该最深节点为X,由于节点最多拥有两个子节点,而所谓“平衡被破坏”意味着X的左右两棵子树的高度相差为2,因此我们可以轻易将情况分为四种:

1. 插入点位于X的左子节点的左子树--(左左)(右旋解决)

2. 插入点位于X的左子节点的右子树--(左右)(先左旋后右旋解决)

3. 插入点位于X的右子节点的左子树--(右左)(先右旋后左旋解决)

4. 插入点位于X的右子节点的右子树--(右右)(左旋解决)

情况1,4彼此对称,称为外侧插入,可以通过单旋转解决;情况2,3彼此对称,称为内侧插入,可以通过双旋转解决。

版权声明:本文为博主原创文章,未经博主允许不得转载。

AVL树详解

标签:

原文地址:http://blog.csdn.net/sxhlovehmm/article/details/47361951

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!