现在的位置: 首页 > 综合 > 正文

AVL Tree 学习笔记

2018年03月15日 ⁄ 综合 ⁄ 共 6934字 ⁄ 字号 评论关闭

作者:一觉亮天 日期:2007-7-21

 

AVL树的定义 

AVL树要先说二叉搜索树。二叉搜索树(Binary
Search Tree)
是这样的二叉树:二叉树的左子树如果不为空,则所有节点的值都小于父节点;二叉树的右子树如果不为空,则所有节点的值都大于父节点。

 

二叉搜索树中查找操作的平均时间复杂度是O(logn),以这种方式组织数据可以节约查找时间。但二叉搜索树如果构造不恰当的话,最坏情况下,查找操作的时间复杂度可能会是O(n)。比如下面图1这种情况:

 

图1

1所示的树被认为是不平衡的,为此引入了平衡二叉搜索树(Balanced Binary Search Tree)的概念。平衡二叉搜索树就是给二叉搜索树增加一些平衡条件,使她不是太瘦高。AVL树就是平衡二叉树的一种。AVL是两个人名字的首字母缩写。在说AVL树平衡条件之前需要引入树的高度的概念。由图2就可以理解对树的高度的定义了。规定空树的高度是-1

图2

AVL树规定树二叉搜索树的左子树的高度和右子树的高度之差的绝对值不能大于1

AVL树的插入和删除操作

AVL树的插入操作和删除操作的第一步和普通二叉搜索树的插入和删除操作相同。

 

插入操作就是依照二叉搜索树的定义把插入的元素放在合适的位置。

 

删除操作可以以下面的算法完成:

找到要删除的节点,如果是叶子节点则直接删除;如果只包含左子树或右子树,则删除此节点,相应的左子树或右子树位置上移;如果既包含左子树又包含右子树,则可以找到此节点右子树中最小的节点,把值赋给待删除节点,然后在此节点的右子树删除最小的节点。

 

进行完普通二叉搜索树的插入操作和删除操作后,有可能破坏AVL树的平衡条件,这时就可以通过树的旋转操作来使她重新平衡。

树的旋转操作

AVL树中插入元素,如果导致了树的不平衡,能通过下面的任意一种旋转操作使树重新平衡。

RR

3

如图3所示,节点5的左子树高度是1,右子树高度是-1,需要对树进行右旋操作。右旋操作的步骤是:节点5的左子树指向节点4的右子树,结点4的右子树指向节点5

 

RL

4

如图4所示,节点4的左子树高度是1,右子树高度是-1,需要对树进行右旋操作。但是如果单纯做右旋操作的话,并不能使树平衡。这时需要两次旋转,先对4节点的左子树进行左旋操作,然后再对节点4进行右旋操作。

 

判断进行RL操作还是进行RR操作是看要进行右旋操作的树的左子树是右重还是左重。右重即树的右子树高度大于左子树。如果要进行右旋操作的树的左子树是右重,则进行RL操作,否则进行RR操作。

LL

5

如图5所示,LL操作和RR操作对称。

LR

6

如图6所示LR操作和RL操作对称。

AVL树的实现

抱歉!评论已关闭.