一、AVL 树是什么?
AVL是一种自平衡的二叉查找树,最大的特点是AVL树任意两个节点的高度差最大为1。什么?你问我二叉查找树是啥?拉黑吧有事漂流瓶联系吧。。。那么请你先去看看什么是二叉查找树在来看AVL吧。
二、怎么实现的?
当然实在二叉树插入或删除数据的时候进行一些 平衡 操作啦。
在AVL树中插入或删除一个节点,使得二叉树失去平衡分为四种状态。
(图片来自参考内容)
1、一个树(可能是子数)的(ROOT) 左子树(L1) 的 左子树(L2) 下的 节点 导致 失去平衡 ,称作 LL:
2、一个树(可能是子数)的(ROOT) 左子树(L1) 的 右子树(R1) 下的 节点 导致 失去平衡 ,称作 LR
3、一个树(可能是子数)的(ROOT) 右子树(R1) 的 左子树(L2) 下的 节点 导致 失去平衡 ,称作 RL
4、一个树(可能是子数)的(ROOT) 右子树(R1) 的 右子树(R2) 下的 节点 导致 失去平衡 ,称作 RR
那么接下来就是 递归的 对失去平衡树(及其父节点为根的树) 的旋转工作。
1、 LL 情况:围绕L1作 右旋
ROOT.left = L2
L1.left = L2.right
L2.right = L1
2、LR 情况:
首先:围绕 L1 作 左旋(RR)
再:围绕 ROOT 作 右旋(LL)
3、RL 情况:
首先:围绕 R1 作 右旋(LL)
再:围绕 ROOT 作 左旋(RR)
4、RR 情况:围绕 R1 作 左旋
ROOT.right = R2
R1.right = R2.left
R2.left = R1
参考:
http://www.cnblogs.com/skywang12345/p/3576969.html