您的位置:首页 > 其它

二叉排序(查找)树的调整

2015-09-30 16:12 134 查看
    一大考点,不得不去研究下,根源是想get这一技能,搞懂了,也就没什么了

    二叉排序树是一种特殊的、增加了限制条件的二叉树,它是实现动态查找的树表,而且是在查找过程中动态生成的,即对于给定key,若表中存在与key相等的元素,则查找成功,不然,插入关键字等于key的元素

    一棵二叉排序树,又称二叉查找树,它要么是一棵空二叉树,或者是具备以下性质的二叉树:

        1.若它的左子树不空,则左子树上所有结点的键值均小于它的根结点键值
        2.若它的右子树不空,则右子树上所有结点的键值均大于它的根结点键值
        3.根的左、右子树也分别为二叉排序树

    但是,并不是所有的二叉排序树都是平衡的,二叉排序树的引出是为了查找,如果查找效率不高,岂不是事倍功半,所以,就衍生了二叉排序树的调平,在平衡二叉树中插入结点与二叉查找树最大的不同在于要随时保证插入后整棵二叉树是平衡的。调整不平衡二叉树的基本方法就是:旋转。这里有四种方法:LL,RR,RL,LR,非常简单,大家听我叨起来:

    平衡因子(平衡度):结点的平衡度是结点的左子树的高度-右子树的高度
    规定:平衡二叉树的每个结点的平衡因子都为+1,-1或0。或者说是  每个结点的左右子树的高度最多差一的二叉树

    所以:
    一棵平衡二叉树或者是空树,或者是具有以下性质的二叉排序树:
        1.左子树与右子树的高度之差的绝对值小于等于1
        2.左子树和右子树也是平衡二叉排序树

    重点来了:不平衡二叉树的调整:  LL   RR   LR  RL 

   

   原则:谁不平衡就动谁   

    方法一:LL

    单向右旋平衡处理,如图,我理解的右旋就是右边的旋转,由于A的左子树根结点B的左子树插入了一个节点,A的平衡因子由1增为2,使以A为根的子树失去平衡,需进行一次向右的顺时针旋转操作。

    

    


    例子:
    
    


    方法二:RR

    单向左旋平衡处理:由于A的右子树根结点B的右子树上插入节点,A的平衡因子由-1变为-2,使A失去平衡。进行一次向左的逆时针旋转,如图

    


    例子:

    


    方法三:LR

    由于A的左子树根结点B的右子树插入节点,使B失去平衡。进行两次旋转,先左旋后右旋

    


    例子:

    


    方法四:RL

    由于A的右子树的根结点B的左子树插入节点,使其失去平衡。进行两次旋转,先右旋,后左旋。

    


    例子:

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: