算法二叉搜索树之AVL树
2017-06-11 04:47
106 查看
最近学习了二叉搜索树中的AVL树,特在此写一篇博客小结。
相信上图已经表示的非常明确,这里就不再细说,值得注意的是:在旋转操作中只有指针的改变,其他属性都保持不变。对旋转前后的树使用中序遍历将得到相同的结果。
A是失去平衡的节点,其失去平衡的原因在于其左节点B中加入了新左节点C,此时我们对A节点进行右旋操作即可恢复AVL树的平衡。
A是失去平衡的节点,其失去平衡的原因在于其左节点B中加入了新右节点C,此时我们需要两次旋转来解决问题,我们先对B节点进行左旋,再对A节点进行右旋即可。
对于RR(右子节点加入新右节点)和RL(右子节点加入新左节点)的情况,只要针对上面的情况进行镜像处理即可。
1.引言
对于二叉搜索树而言,其插入查找删除等性能直接和树的高度有关,因此我们发明了平衡二叉搜索树。在计算机科学中,AVL树是最先发明的自平衡二叉搜索树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。对于N个节点的AVL树,由于树高被限制为lgN,因此其插入查找删除操作耗时为O(lgN)。2.旋转
在讲解关键步骤插入与删除以前,首先我们先定义一些辅助用的操作:旋转。旋转分为左旋和右旋,其示意图如下:相信上图已经表示的非常明确,这里就不再细说,值得注意的是:在旋转操作中只有指针的改变,其他属性都保持不变。对旋转前后的树使用中序遍历将得到相同的结果。
3.插入
对于AVL树而言一个关键的操作就是插入操作。往AVL树中插入新的节点可能会引起AVL树的性质被破坏,我们分为以下两种情况来讨论(我们只讨论左子树的情况,右子树的情况只需镜像处理即可):1.左左情况(LL)
这种情况如下:A是失去平衡的节点,其失去平衡的原因在于其左节点B中加入了新左节点C,此时我们对A节点进行右旋操作即可恢复AVL树的平衡。
2.左右情况(LR)
这种情况需要进行两次旋转,如下图所示:A是失去平衡的节点,其失去平衡的原因在于其左节点B中加入了新右节点C,此时我们需要两次旋转来解决问题,我们先对B节点进行左旋,再对A节点进行右旋即可。
对于RR(右子节点加入新右节点)和RL(右子节点加入新左节点)的情况,只要针对上面的情况进行镜像处理即可。
4.删除
对AVL树的某个节点进行删除后,我们需要判断其父节点是否还符合AVL树的性质,如果否则进行与插入情况类似的旋转处理即可,在此不再赘述。相关文章推荐
- [算法学习笔记] AVL树----带有平衡条件的二叉搜索树
- C 算法精介----二叉搜索树-->AVL树->分析与实现
- 【简单算法】30.将有序数组转换为二叉搜索树
- 高度平衡的二叉搜索树-----AVL树
- [算法] avl树实现
- [算法学习]二叉搜索树转双向链表
- 二叉树、二叉搜索树、AVL树的java实现
- 算法导论--最优二叉搜索树
- 算法基础知识科普:8大搜索算法之二叉搜索树(中)
- 【数据结构与算法基础】AVL树 / AVL Tree
- PTA 数据结构与算法题目集(中文)5-4 是否同一棵二叉搜索树 (25分)
- 【算法】求二叉搜索树的第K个结点
- AVL树的JAVA实现及AVL树的旋转算法
- 算法复习-二叉搜索树BST的c++实现
- 【数据结构与算法】二叉搜索树 及 常用操作
- 红黑树(red-black tree)算法,附AVL树的比较
- 二叉搜索树-BST-查找算法-插入算法-删除算法 http://www.cnblogs.com/pangxiaodong/archive/2011/08/24/2151060.html
- 0020算法笔记——【动态规划】最优二叉搜索树问题
- 《剑指offer》之二叉搜索树(BST)与平衡二叉树(AVL树)专题
- 红黑树(red-black tree)算法,附AVL树的比较