《算法导论》第12章 二叉搜索树 个人笔记

来源:互联网 发布:ubuntu 16.04安装lnmp 编辑:程序博客网 时间:2024/06/10 03:24

第12章 二叉搜索树

12.1 定义

设x是二叉搜索树中的一个结点。如果y是x左子树中的一个结点,则有y.keyx.key。如果y是x右子树中的一个结点,则有y.keyx.key
遍历

INORDER-TREE-WALK(x)if x != NULL    INORDER-TREE-WALK(x.left)    print x.key    INORDER-TREE-WALK(x.right)

如果x是一颗有n个结点子树的根,那么调用INORDER-TREE-WALK(x)需要Θ(n)时间。

12.2 查询

查找指定关键字k

  • 递归式:
TREE-SEARCH(x,k)if x == NULL || k == x.key    return xif k < x.key    return TREE-SEARCH(x.left,k)else return TREE-SEARCH(x.right,k)
  • while循环式:
ITERATIVE-TREE-SEARCH(x,k)while x != NULL && k != x.key    if k < x.key        x = x.left    else x = x.rightreturn x

查找最小和最大关键字、前继和后驱

  • 最小关键字
TREE-MINIMUM(x)while x.left != NULL    x = x.leftreturn x
  • 最大关键字
TREE-MAXIMUM(x)while x.right != NULL    x = x.rightreturn x
  • 后驱
TREE-SUCCESSOR(x)if x.right != NULL    return TREE-MINIMUM(x.right)y = x.pwhile y != NULL && y.right == x    x = y    y = y.preturn y
  • 前继
TREE-PREDECESSOR(x)if x.left != NULL    return TREE-MAXIMUM(x.left)y = x.pwhile y != NULL && y.left == x    x = y    y = y.preturn y

定理:在一颗高度为h的二叉搜索树上,动态集合上的以上5个查询操作可以在O(h)时间内完成。

12.3 插入和删除

  • 插入(默认树中不存在待插入的关键字)
TREE-INSERT(T,z)y = NULLx = T.rootwhile x != NULL    y = x    if z.key < x.key        x = x.left    else x = x.rightz.p = yif y == NULL    T.root = z  //tree T was emptyelseif z.key < y.key    y.left = zelse y.right = z
  • 删除
// 用一颗以v为根的子树替换一颗以u为根的子树,// 结点u的双亲变为结点v的双亲TRANSPLANT(T,u,v)if u.p == NULL    T.root = velseif u == u.p.left    u.p.left = velse u.p.right = vif v != NULL    v.p = u.pTREE-DELETE(T,z)if z.left ==  NULL    TRANSPLANT(T,z,z.right)elseif z.right == NULL    TRANSPLANT(T,z,z.left)else    y = TREE-MINIMUM(z.right) // find z's successor    if y.p != z        TRANSPLANT(T,y,y.right)        y.right = z.right        y.right.p = y    TRANSPLANT(T,z,y)    y.left = z.left    t.left.p = y

定理:在一颗高度为h的二叉搜索树上,动态集合上的INSERT和DELETE操作可以在O(h)时间内完成。

12.4 随机构建二叉搜索树

定理:一颗有n个不同关键字的随机构建二叉搜索树的期望为O(lgn)

阅读全文
0 0