算法导论 第十二章 二叉搜索树

12.1什么是二叉搜索树

def:二叉搜索树是具有如下性质的二叉树,设x是二叉搜索树中的一个节点。如果y是x左子树中的一个节点,那么y.key <= x.key。如果y是x右子树中的一个节点,那么 y.key >= x.key。

二叉搜索树的性质运行我们通过一个递归算法允许我们按序输出所有节点。如中序遍历:

def INORDER_TREE_WALK(x):
    if x != None:
        INORDER_TREE_WALK(x.left)
        print( x.key)
        INORDER_TREE_WALK(x.right)
算法分析:



12.2 查询二叉搜索树

由二叉搜索树的性质我们有如下定理:


def TREE_SEARCH(x, k):
    if x == None or k == x.key:
        return x
    if k < x.key:
        return TREE_SEARCH(x.left, k)
    else:
        return TREE_SEARCH(x.right,k)

def ITERATIVE_TREE_SEARCH(x,k):
    while x != None and k != x.key:
        if k < x.key:
            x = x.left
        else:
            x = x.right
    return x

def TREE_MINIMUM(x):
    while x.left != None:
        x = x.left
    return x

def TREE_MAXIMUM(x):
    while x.right != None:
        x = x.right
    return x

def TREE_SUCCESSOR(x):
    if x.right != None:
        return TREE_MINIMUM(x.right)

    y = x.parent
    while y != None and x == y.right:
        x = y
        y = y.parent

    return y

def TREE_PREDECESSOR(x):
    if x.left != None:
        return TREE_MAXIMUM(x.left)

    y = x.parent
    while y != None and x == y.left:
        x = y
        y = y.parent

    return y
        
以上过程完成对定理的证明


12.3插入和删除

def TREE_INSERT(T, z):
    y = None
    x = T.root
    while x != None:
        y = x
        if z.key < x.key:
            x = x.left
        else:
            x = x.right
    z.parent = y
    if y == None:
        T.root = z
    elif z.key < y.key:
        y.left = z
    else:
        y.right = z

def TRANSPLANT(T, u, v):
    if u.parent == None:
        T.root = v
    elif u == u.parent.left:
        u.parent.left = v
    else:
        u.parent.right = v

    if v != None:
        v.parent = u.parent

def TREE_DELETE(T, z):
    if z.left == None:
        TRANSPLANT(T, z, z.right)
    elif z.right == None:
        TRANSPLANT(T, z, z.left)
    else:
        y = TREE_MINIMUM(z.right)
        if y.parent != z:
            TRANSPLANT(T, y, y.right)
            y.right = z.right
            y.right.parent = y

        TRANSPLANT(T, z, y)
        y.left = z.left
        y.left.parent = y
以上过程完成对定理的证明


12.4随机构建二叉搜索树






习题解答


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值