数据结构笔记(3)树——AVL树以及恼人的旋转
2017-12-21 22:42
274 查看
AVL树
带有平衡条件的二叉查找树——每个节点的左子树和右子树的高度最多差1的二叉查找树。空树的高度定义为-1。
当插入节点时,有可能破坏AVL树的平衡性,分为以下几种情形:
对a的左儿子的左子树进行一次插入(左左/LL)
对a的右儿子的右子树进行一次插入(右右/RR)
对a的左儿子的右子树进行一次插入(左右/LR)
对a的右儿子的左子树进行一次插入(右左/RL)
对于以上四种情形,可分为两类,前两者通过单旋转解决,后两种通过双旋转解决。
单旋转:
可以看出节点8成为了插入后被破坏平衡的点,则在该点与其子节点间做一次单旋转(-8–9-),图示为对RR情况进行的逆时针旋转。
单旋转将被破坏平衡的点降下一单位高度,其子树提升至其原来的位置。
值得一提的是,如果节点9拥有左子树(8< x <9)需要将该树(x)添加到8节点的右子树上以保持整个树仍为二叉查找树。
双旋转:
易知当插入节点14后,被破坏平衡的节点为6,插入方式为右左:
先将右儿子向右转。
再将根向左转。
双旋转先解决被插入的儿子,再解决根节点。
在进行旋转时,同样要遵守“过继”的原则,就是把被提升节点的对应子树赋给其新子树的对应位置。(emmmm,不是很好形容,但是我觉得“过继”这个词很传神。)
相关文章推荐
- c++模板类构建AVlL树及AVL树的单双旋转图文简述,以及插入新节点后如何通过旋转使之继续保持平衡
- AVL树的插入以及四种旋转
- c++模板类构建AVlL树及AVL树的单双旋转图文简述,以及插入新节点后如何通过旋转使之继续保持平衡
- 【AVL树】AVL树的插入操作以及旋转
- AVL树的插入以及四种旋转解析
- OpenCV 求外接矩形以及旋转角度
- css实现下拉菜单以及下拉箭头旋转效果
- AVL树的旋转
- iOS系统自带的 **UIAlertView** 以及 屏幕自动旋转的实现
- AVL树(高度平衡的二叉搜索树)平衡因子的调节和旋转
- AVL树的旋转、插入、删除及遍历C语言实现
- AVL树之旋转
- 导航栏标题的设置以及左右按钮的颜色、选取照片弹出UIImagePickView时状态栏上移问题、View向上旋转某个角度
- 平衡二叉树以及平衡二叉树旋转
- Android 屏幕旋转生命周期以及处理方法
- C++模板实现二叉树(六 AVL树基础与旋转)
- iOS6下屏幕旋转不响应以及使用Three20不旋转解决方案
- AVL树的旋转操作 图解 最详细
- IOS设备旋转的内部处理流程以及一些【优化建议】
- 红黑树C++实现以及与AVL树的区别