AVL平衡树(详解)-JAVA版本
来源:互联网 发布:张继科 极速前进 知乎 编辑:程序博客网 时间:2024/05/17 01:44
平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树.
它通过旋转不平衡的节点来使二叉树重新保持平衡,并且查找、插入和删除操作在平均和最坏情况下时间复杂度都是O(log n)
AVL树的旋转一共有四种情形,注意所有旋转情况都是围绕着使得二叉树不平衡的第一个节点展开的。
RBT VS AVL:
实际上插入AVL树和红黑树的速度取决于你所插入的数据.如果你的数据分布较好,则比较宜于采用AVL树(例如随机产生系列数),
但是如果你想处理比较杂乱的情况,则红黑树是比较快的,因为红黑树对已经处理好的数据重新平衡减少了不心要的操作.另外一方面,如果是一种非寻常的插入系列比较常见(比如,插入密钥系列),则AVL树比较快,因为它的严格的平衡规则将会减少树的高度
在做插入和删除操作的时候,AVL树要做的调整比红黑树多了很多
RBT调整到平衡最多只需旋转2次,这就是优点,高度不会超过2lg(n),所以查找效率一样
老式的Linux内核的任务调度就是用的AVL,从某一个版本开始换RBT了.
1. LL型
平衡二叉树某一节点的左孩子的左子树上插入一个新的节点,使得该节点不再平衡。这时只需要把树向右旋转一次即可,如图所示,原A的左孩子B变为父结点,A变为其右孩子,而原B的右子树变为A的左子树,注意旋转之后Brh是A的左子树(图上忘在A于Brh之间标实线)
2. RR型
平衡二叉树某一节点的右孩子的右子树上插入一个新的节点,使得该节点不再平衡。这时只需要把树向左旋转一次即可,如图所示,原A右孩子B变为父结点,A变为其左孩子,而原B的左子树Blh将变为A的右子树。
3. LR型
平衡二叉树某一节点的左孩子的右子树上插入一个新的节点,使得该节点不再平衡。这时需要旋转两次,仅一次的旋转是不能够使二叉树再次平衡。如图所示,在B节点按照RR型向左旋转一次之后,二叉树在A节点仍然不能保持平衡,这时还需要再向右旋转一次。
4. RL型
平衡二叉树某一节点的右孩子的左子树上插入一个新的节点,使得该节点不再平衡。同样,这时需要旋转两次,旋转方向刚好同LR型相反。
- AVL平衡树(详解)-JAVA版本
- AVL平衡树(详解)-JAVA/C版本
- 平衡树(AVL)详解
- 平衡树(AVL)详解
- 平衡树详解之AVL
- 平衡二叉树AVL详解
- AVL树平衡因子详解
- 二叉树-详解平衡二叉排序树AVL
- AVL - 自平衡二叉树 - 详解
- AVL平衡二叉树图+代码详解
- java平衡搜索树AVL实现
- AVL平衡二叉树Java实现
- AVL平衡二叉查找树实现(C语言版本)
- AVL(平衡树)
- AVL平衡树实现
- AVL 平衡二叉树
- 平衡二叉树(AVL)
- AVL平衡树实现
- Hadoop学习总结
- 即时通信之Bmob开发06
- 不同等级的debug信息打印
- 天声人語 20150413
- [LeetCode]Reverse Linked List II
- AVL平衡树(详解)-JAVA版本
- 日经春秋 20150413
- POJ 1001
- american fuzzy lop
- angular grid
- 日经社説 20150413 LCCの普及を後押ししよう
- jvm 自带的监控工具
- Android应用性能优化笔记
- 多网卡PC装OVS改造成OpenFlow交换机配置脚本