• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

平衡二叉树旋转问题?

@曲终人散@ 2017-11-18 浏览量:630
当进行左旋或者右旋时,具体的操作是做什么,看程序看蒙了
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你大概这样思考,
    当在某个结点p的左子树q的左子树处插入时要右旋转,因为左边出现了失衡,

    其实旋转就是一个换失衡根结点的问题,

    那么再思考,要保持排序树的特性,如何更换根结点

    有几种方案

    一种是选择左子树的最右结点直接替换为根,然后把替换了的根安排到右子树的最左位置,

    这样可以保持排序的特性,但不一定能保证平衡

    一种是把左子树根结点P做为根结点,但这时涉及到左子树根结点的右子树Pr安排问题,

    因为要保证左边的全部比P小,而实际上原来的Pr都比它大,这样我们就思考把他做为原根结

    点的左子树,把原根结点做为P的右子树,这样不仅保证了排序的特性还保证了平衡


    大概的代码如下
    P=R->LChild;//P为失衡结点的左子树根结点
    R->LChild=P->RChild;//把P的右子树做为R的左子树
    P->RChild=R;//把P替换为根结点

    其它的旋转都是一样的原理,你要多动手划一划,我这时间不多,不好再给你一一画图说明,不好意思,你多多思考吧。

    其实右旋就是把失衡结点的左子树根结点提升为二叉树的根结点,然后你再想想如何保持有序就行了
    其实左旋就是把失衡结点的右子树根结点提升为二叉树的根结点,然后你再想想如何保持有序就行了
    RL就是二者的结合,但要从最下层失衡结点开始

    不能仅靠记忆,你可以先加强理解排序二叉树的插入和删除的理解,当然,这里只是换位置,其实很多东西是一样的。
    • 发布于 2017-11-20
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :B:符合ROHS OSA1:包装 回复

其他答案 数量:1
  • 旋转是指左右轴对称替换吗?如果是轴对称替换的话使用先序遍历(中左右),把二叉树的内容记录下来之后换成反向先序遍历(中右左)就可以了。
    • 发布于2017-11-30
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  : 回复

相关问题

问题达人换一批

平衡二叉树旋转问题?