二叉搜索树(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