性质:对任何节点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