二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。
#定义
二叉排序树或者是一棵空树,或者是具有下列性质的
二叉树
:
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
#实现
#定义
#ifdef _Tree_H
struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
SearchTree MakeEmpty( SearchTree T );
Position Find( Element 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 );
#endif // _Tree_H
struct TreeNode
{
ElementType Element;
SearchTree Left;
SearchTree Right;
};
1)MakeEmpty
用于初始化
SearchTree
MakeEmpty( SearchTree T )
{
if( T!=Null )
{
MakeEmpty( T->Left );
MakeEmpty( T->Right );
free( T );
}
return 0;
}
2)Find
返回指向树T中具有关键字X的节点的指针,若不存在,返回NULL。
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->Right );
else
return T;
}
3)FindMin和FindMax
返回树中最小元和最大元的位置。
由定义不难猜到,由根节点一路向左,能得到最小元;一路向右能得到最大元。
实现的方法由两种:尾递归和循环,下边分别用两个函数做演示:
Position
FindMin(SearchTree T) //递归实现
{
if( T == NULL )
return NULL;
else
if( T->Left == NULL )
return T;
else
return FindMin( T->Left );
}
Position
FindMax( SearchTree T ) //循环实现
{
if( T != NULL )
while( T-> Right != NULL)
T = T->Right;
return T;
}
4)Insert
插入操作。为了将X插入树T中,可以像Find那样沿着树查找。如果找到X则什么都不用做。否则,将X插入到遍历路径的最后一点。