您的位置:首页 > 其它

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

2014-08-06 21:29 190 查看
二叉搜索树(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: