树的旋转

在学习红黑树,树堆,平衡树的时候我们经常会看到一个树的操作---旋转。树的旋转之前也只是机械记忆而已,但机械记忆的东西终归不是自己的,这说明自己没有理解到其中的精髓。

 
定义:树旋转是二叉树中一种子树调整操作,每一次旋转不会影响二叉树的中序遍历结果。
 
二叉树的中序遍历结果可以用投影的方式快速得到,如图所示:
 
如果这是一颗搜索树,那么中序遍历的顺序一定是自小而大的,这点很重要,也就是树的旋
转不会影响树的搜索功能特性。
 


右旋:以某一个点为转轴,向右转动,不可影响中序遍历结果。左旋一样。
左右旋是互逆的。
 
先看下大致的图片
 
 
我们的问题在于如何理解记忆
 
1.确定旋转轴,这个旋转轴是在自己指定的。
2.将以旋转轴为根的子树单独抽出来进行旋转。
3.假定我指示了,Q为右旋旋转轴,这意味着其子孙应该以q为中心向顺时针旋转,很明显
c是不可以选择的,因为一旦c旋转了,中序遍历结果就发生了变化,p可以旋转,成为q的
父亲,那么b就被抛弃了,为了不改变中序遍历结果,b作为q的一个孩子重新连接。
 
那么整个右旋过程为:选择一个旋转点,右孩子不动,左孩子右旋为自己的父亲,左孩子的
右孩子成为自己的左儿子。右旋为右孩子不动,左孩子旋转为自己的父亲,左孩子遗弃的孩
子作为自己的新孩子。
 
左旋正好相反。
 
 
最后记忆几个关键句子:
 
旋转轴肯定是根
旋转的对象肯定是孩子
左旋肯定旋转右孩子,右旋肯定旋转左孩子
被旋转的孩子成为新根
中序遍历结果不受影响
旋转涉及到的父子关系的改变最多两条(如右旋中的只有pq,cb是新的关系)
posted @ 2016-03-15 17:17  神不知鬼不晓  阅读(719)  评论(0)    收藏  举报
编辑推荐:
· 一个字符串替换引发的性能血案:正则回溯与救赎之路
· 为什么说方法的参数最好不要超过4个?
· C#.Net 筑基-优雅 LINQ 的查询艺术
· 一个自认为理想主义者的程序员,写了5年公众号、博客的初衷
· 大数据高并发核心场景实战,数据持久化之冷热分离
阅读排行:
· 发布一个小功能,通过 markdown 图片语法嵌入B站视频
· 《HelloGitHub》第 111 期
· 使用GcExcel .NET将Excel导出为PDF
· MySQL 字符集、排序规则与查询关系详解
· 【设计模式】外观模式
点击右上角即可分享
微信分享提示