二叉查找树 (Binary Search Tree, BST) 是二叉树在查找中的一种重要应用形式。
在这篇文章接下来的叙述中,做出以下假设:
- 尽管二叉树节点中存储的数据类型是任意的,但为了大小比较和理解的方便,本文中将数据类型指定为整数。
- 各个节点中的存储的数据是没有重复的。
定义
若一棵二叉树为二叉查找树,那么它必须满足:
- 对于树中的任意节点 X X X,若其左子树不为空,则左子树中每一个节点的值都小于其根节点的值
- 对于树中的任意节点 X X X,若其右子树不为空,则右子树中每一个节点的值都大于或等于其根节点的值
- 对于树中的任意节点 X X X,其左子树、右子树也为二叉查找树
这是一个明显带有递归特征的定义。根据这个定义,下面给出一个正确的 BST 示例和两个错误的 BST 实例。
声明
我们给出 BST 的类型定义并列出 BST 的一系列基本操作,如下即为 BST 的声明程序。
typedef int ElementType;
struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
/*BST 的基本操作定义 */
SearchTree MakeEmpty(SearchTree T);
Position Find(ElementType X, SearchTree T);
Position FindMin(SearchTree T);
Position FindMax(SearchTree T);
SearchTree Insert(ElementType X, SearchTree T);
SearchTree Delete(ElementType X, SearchTree T);
ElementType Retrieve(Position P);
/* 单个树节点的结构体定义 */
struct TreeNode
{
ElementType Element;
SearchTree Left;
SearchTree Right;
};
接下来我们将对 BST 的基本操作进行逐一实现。
基本操作
初始化 MakeEmpty
该操作用于初始化树 T T T。
事实上,我们可以把 BST 的第一个元素初始化为一个单节点树,但是下面给出的初始化代码是一种更加遵循递归原则的形式(如 BST 的定义一样)。
/* 初始化一棵树 T*/
SearchTree MakeEmpty(SearchTree T)
{
if (T != NULL)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
}
查找任意值 Find
该操作用于返回给定的树 T T T 中值为 X X X 的节点的指针。若不存在则返回 NULL。
/* 对树 T 查找值 X 的位置 */
Position Find(ElementType X, SearchTree T)
{
if (T == NULL)
return NULL;
if (X < T->Element)
return Find(X, T->Left);
else if (X> T->Element)
return Find(X, T