你大概这样思考, 当在某个结点p的左子树q的左子树处插入时要右旋转,因为左边出现了失衡,
其实旋转就是一个换失衡根结点的问题,
那么再思考,要保持排序树的特性,如何更换根结点
有几种方案
一种是选择左子树的最右结点直接替换为根,然后把替换了的根安排到右子树的最左位置, 这样可以保持排序的特性,但不一定能保证平衡 一种是把左子树根结点P做为根结点,但这时涉及到左子树根结点的右子树Pr安排问题, 因为要保证左边的全部比P小,而实际上原来的Pr都比它大,这样我们就思考把他做为原根结 点的左子树,把原根结点做为P的右子树,这样不仅保证了排序的特性还保证了平衡 大概的代码如下 P=R->LChild;//P为失衡结点的左子树根结点 R->LChild=P->RChild;//把P的右子树做为R的左子树 P->RChild=R;//把P替换为根结点
其它的旋转都是一样的原理,你要多动手划一划,我这时间不多,不好再给你一一画图说明,不好意思,你多多思考吧。
其实右旋就是把失衡结点的左子树根结点提升为二叉树的根结点,然后你再想想如何保持有序就行了 其实左旋就是把失衡结点的右子树根结点提升为二叉树的根结点,然后你再想想如何保持有序就行了 RL就是二者的结合,但要从最下层失衡结点开始
不能仅靠记忆,你可以先加强理解排序二叉树的插入和删除的理解,当然,这里只是换位置,其实很多东西是一样的。
|