一、概念
1.定义与性质
(1)设x为二叉查找树中的一个结点,若y是x左子树中的一个结点,则key[y] <= key[x];若y是x右子树中的一个结点,则key[x]<=key[y](2)二叉查找树上执行的基本操作的时间与树的高度成正比。
2.结构
(1)结点结构:
关键字key卫星数据data
分别指向父、左右孩子的指针p, left, right
3.在二叉查找树上的操作
查找一个关键字:SEARCH(x, k)求最小关键字:MINIMUM(x)
求最大关键字:MAXIMUM(x)
求前驱:PREDECESSOR(x)
求后继:SUCCESSOR(x)
插入一个结点:INSERT(T, z)
删除一个结点:DELETE(z)
4.二叉查找树的应用
1.遍历:中序遍历、先序遍历、后序遍历2.查找:查找包含某个关键字的结点,查找关键字最大或最小的结点、查找某个结点的前驱或后继
一棵二叉树查找及其中根遍历结果如下图所示:
(1)查找
在二叉查找树中查找一个给定的关键字k的过程与二分查找很类似,根据二叉查找树在的关键字存放的特征,很容易得出查找过程:首先是关键字k与树根的关键字进行比较,如果k大比根的关键字大,则在根的右子树中查找,否则在根的左子树中查找,重复此过程,直到找到与遇到空结点为止。例如下图所示的查找关键字13的过程:(查找过程每次在左右子树中做出选择,减少一半的工作量)
书上查找过程的递归和非递归形式的伪代码:
TREE_SEARCH(x,k)
if x=NULL or k=key[x]
then return x
if(k<x.key)
then return TREE_SEARCH(x.left,k)
else
then return TREE_SEARCH(x.right,k)
ITERATIVE_TREE_SEARCH(x,k)
while x!=NULL and k!=x.key
do if k<x.key
then x=x.left
else
then x=x.right
return x