AVL树常用算法算法

上一次我们讲了BST二叉搜索树的结构,添加一个约束条件。左子树要比右子树小,这样来约束二叉树的性质。但是BST同时也是有一个很大缺陷的,就是有可能出现下图的情况
这里写图片描述
(图转自:http://www.cnblogs.com/vamei/archive/2013/03/21/2964092.html
这种情况就是BST彻底退化成一颗二叉树。查找节点的时间还是需要O(n)的时间,这显然是不可以接受的。所以我们还需要再加一个约束条件就是左子树和右子树相差不超过1.加上这个约束条件以后,二叉树就会十分接近于一颗完全二叉树了。这样显然就避免了退化的情况。
AVL的增加操作就会出现打破这种平衡的情况,这时候需要我们通过自旋来修复条件。如何进行自旋呢。分为四种情况,分别是LL,RR,LR,RL。
首先是LL:
这里写图片描述
其实主要思路就是寻找这颗子树的root节点,根据BST的定义,不难看出应该是找中间节点2作为root。所以得出来根节点作为左子树,子节点作为右子树。
如何RR与LL类似,只不过一个左一个右罢了。
AVL的旋转关键是下面两个旋转LR和RL:
这里写图片描述
LR和RL思路其实也是一样的,因为子节点就是2它处于中间位置,所以拿2作为root节点,然后进行旋转。
在旋转的过程中我们经常遇到一种情况:
这里写图片描述
按照我们刚刚所说的原理进行旋转,那我们不是出现这种问题啦?这个是什么鬼问题呢。。。就是旋转的时候破坏了二叉树的特点,其实大家还记不记得BST的删除操作那里,删除一个具有left和right节点的一颗节点。我的算法是先拿它右子树的最小节点进行替换,然后在把最小的节点删除掉,其实这样做的原理就是BST里面左子树最右的节点和root和右子树最左节点的值是相邻的。其实和我们接下来的操作形势上没有什么相似,但是我这样说一下。扩展一下大家思路,大家想到怎么搞没,其实就是把4挂到5的左子树就可以了。如图
这里写图片描述
上面就是我对AVL旋转的理解。下次有时间我会继续研究其代码实现的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值