二叉搜索树(算法导论第12章)

二叉搜索树(Binary Search Tree BST,也称排序二叉树,二分搜索树)是一种数据结构。

二叉搜索树上的基本操作所花费的时间与这棵树的高度成正比。

这样一棵树可以使用一个链表数据结构来表示,其中每个结点就是一个对象。除了key和卫星数据之外,每个结点还包含属性left,right和p,它们分别指向结点的左孩子、右孩子和双亲。根结点是树中唯一父指针为NIL的结点。

二叉搜索树中的关键字总是以满足二叉搜索树性质的方式来存储:

        设x是二叉搜索树的一个结点。如果y是x左子树中的一个结点,那么y.key<=x.key。如果y是x右子树中的一个结点,那么y.key>=x.key。

搜索算法:中序遍历(inorder tree walk-左根右),先序遍历(preorder tree walk-根左右),后序遍历(posorder tree walk-左右根)

INORDER-TREE-WALK(x)
  if x≠NIL
      INORDER-TREE-WALK(x.left)
      print x.key
      INORDER-TREE-WALK(x.right)
查找:输入一个指向树根的指针和一个关键字k,如果这个结点存在,TREE-SEARCH返回一个指向关键字为k的结点的指针;否则返回NIL。

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)
迭代版本效率更高,代码如下:

ITERATIVE-TREE-SEAECH(x,k)
  while x≠NIL and k≠x.key
      if k<x.key
          x=x.left
      else x=x.right
  return x
最大关键字和最小关键字:

TREE-MINIMUM(x)
  while x.left≠NIL
      x=x.left
  return x

TREE-MAXIMUM(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

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

插入和删除:
TREE-INSERT(T,z)
  y=NIL
  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



TRANSPLANT(T,u,v)
  if u.p==NIL
       T.root=v
  elseif u==u.p.left
       u.p.left=v
  else u.p.right=v
  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-MINIMUM(z.right)
       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
       y.left.p=y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值