二叉排序平衡树查找-动态查找

二叉排序平衡树查找-动态查找
更新:2013-12-02
//


需要掌握的前提知识是二叉排序树查找

名称:二叉排序平衡树查找
关键字:二叉平衡树,二叉排序树

在二叉排序树的不断插入查找中,有可能出现极端情况,最坏情况例如:
每棵树都只有右孩子。那样查找变成了顺序查找了。
为了使排序树的深度最小,需要对每棵树的左右孩子进行平衡处理,成为
二叉平衡树。
二叉平衡树:它是一棵空树,或者,它的左孩子或右孩子不为空的话也为
平衡二叉树。二叉平衡树的左孩子和右孩子的深度差绝对值不能超过1。
如果将平衡因子设为左子树的深度减去右子树的深度,那么值有-1,0,1。

讨论一下插入结点时的平衡操作。

插入结点可以分为两种:
一插入根结点,二插入叶子结点。
插入根结点较为简单,着重看插入叶子结点的情况。
(1)设有树tree1:
            a(2)                     b(0)
            /    \                     /    \
      b(1)      ar      =>    bl      a(0)
     /    \                          ^      /    \
   bl      br                      c    br     ar
   ^
   c
   或树tree1':
           a(2)                b(0)
          /                       /    \
      b(1)          =>    bl      a(0)
     /
    ^
    bl
因为插入新结点而使树的平衡因子变为2,在这种情况下,需要作
单向右旋平衡处理
b和a交换位置,a接管b的右孩子br,那样树就平衡了,并且树的结点被中
序遍历的顺序不变。
(2)设有树tree2:
          a(-2)                             b(0)
          /    \                               /    \
        al      b(-1)     =>        a(0)     br
                 /     \                  /    \       ^
              bl       br             al      bl    c
                        ^
                        c
   或树tree2':
           a(-2)                            b(0)
                  \                            /    \
                b(-1)     =>        a(0)     br
                       \
                       ^
                       br
因为插入新结点而使树的平衡因子变为-2,在这种情况下,需要作
单向左旋平衡处理
b和a交换位置,a接管b的左孩子bl,那样树就平衡了,并且树的结点被中序
遍历的顺序不变。因为不确定bl是否为NULL,所以a的平衡因子不确定。
(3)设有树tree3:
            a(2)                          a(2)                ____br(0)____
            /    \                           /    \               /                       \
     b(-1)      ar    =>       br(?)      ar   =>  b(?)                 a(?)
     /    \                          /     \                    /    \                 /     \
  bl      br(?)             b(?)    null\d          bl      c\null null\d      ar
           /     \              /    \
   c\null       null\d  bl      c\null
  或树tree3':
            a(2)                      a(2)               br(0)
            /                           /                     /     \
     b(-1)            =>    br(1)        =>   b(0)       a(0)
           \                     /
           ^               b(0)
           br
因为插入新结点或d结点而使树的平衡因子变为2,在这种情况下,需要作
双向旋转(先左后右)平衡处理:先b和br作单向左旋,然后br和a作单向
右旋,那样树就平衡了。并且树的结点被中序遍的顺序不变。
(4)设有树tree4:
           a(-2)                  a(-2)                     ____bl(0)____
           /    \                    /    \                      /                      \
        al      b(1)  =>    al      bl(?)   =>      a(?)                b(?)
                 /    \                   /     \              /    \                 /    \
          bl(?)      br      c\null       b(?)     al      c\null null\d      br
           /    \                               /    \
    c\null    null\d               null\d      br
   或树tree4':
           a(-2)               a(-2)                       bl(0)
               \                        \                        /     \
                b(1)  =>            bl(-1)   =>  a(0)       b(0)
               /                             \
              ^                              b(0)
             bl
因为插入新结点或d结点而使树的平衡因子变为-2,在这种情况下,需要作
双向旋转(先右后左)平衡处理:先b和bl作单向右旋,然后br和a作单向
左旋,那样树就
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值