二叉搜索树

来源:互联网 发布:淘宝海报多少钱一张 编辑:程序博客网 时间:2024/06/17 04:55
性质:对任何节点x,其左子树中的关键字最大不超过x.key,右子树中的关键字最小不低于x.key
    基本操作所花费的时间与树的高度成正比;search/minimum/maximun/predecessor/successor
    随机构建一棵二叉搜索树的期望高度为O(lg n)


查找【O(h)】
TREE-SEARCH(x, k)
    if x == NIL or k == x.key
        return x
    if k < x.key
        return TREE-SEARCH(x.left, k)
    else
        return TREE-SEARCH(x.right, k)

最小
TREE-MINIMUM(x)
    while x.left != NIL
        x = x.left
return x

最大
TREE-MAXIMUN(x)
    while x.right != NIL
        x = x.right
return x

后继和前驱
TREE-SUCCESSOR(x)
    if x.right != NIL
        return TREE-MINIMUM(x.right)
    y = x.p
    while y != NIL and x == y.right
        x = y
        y = y.p
    return y

插入【插入节点z,往下找到z插入的位置】
TREE-INSERT(T, z)
    y = NIL                    //x的双亲节点
    x = T.root                //
    while x != NIL
        y = x
        if z.key < x.key
            x = x.left
        else x = x.right
    z.p = y
    if y == NIL                //树是空的
        T.root = z
    elseif z.key < y.key
        y.left = z
    else
        y.right = z

删除【删除节点z】
1) z没有孩子节点,直接删除
2) z只有一个孩子,将其孩子提升到树中z的位置,并修改z的父节点的孩子节点以及孩子节点的父节点
3) z有两个孩子,先找z的后继y【递增顺序中在z的后面,一定在z的右子树中】,并让y占据z的位置

引入一个子过程TRANSPLANT,用另一棵子树替换一棵子树并成为其双亲的孩子节点;
TRANSPLANT(T, u, v)
    if(u.p == NIL)                //原树仅有一个节点
        T.root = v
    elseif u == u.p.left
        v = u.p.left
    else v = u.p.right
if v != NIL
    v.p = u.p
TREE-DELETE(T, z)
    if(z.left == NIL)
        TRANSPLANT(T, z, z.right)
    elseif z.right == NIL
        TRANSPLANT(T, z, z.left)
    else y = TREE-MINIMUN(z.right)          //找到z的右子树的最小节点,即z的后继节点;y肯定没有左孩子
        if y.p != z                                            //如果y不是z的子节点,则先让y的右孩子节点代替y,再让y代替z的位置
            TRANSPLANT(T, y, y.right)
            y.right  = z.right
            y.right.p = y
        TRANSPLANT(T, z, y)
        y.left = z.left
        y.left.p = y

0 0
原创粉丝点击