使二叉树成为二叉查找树的性质是,对于树中的每一个节点X,他的左子树中所有关键字值小于X的关键字,而他的右子树中所有关键字值大于X的值。
1:二叉查找树的声明
#ifndef _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 );
SearchTree Insearch( Element x,SearchTree T );
ElementType ( Position P );
#endif
struct TreeNode
{
ElementType Element;
SearchTree Left;
SearchTree Right;
};
2:Find操作
Position
Find( ElementType x,SearchTree T )
{
if( T == NULL )
return NULL;
if( x < T->Element )
return Find( x,T->Left );
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->Righrt;
return T;
}
4:Insert操作
SearchTree
Insearch( ElementType x,SearchTree T )
{
if( T== NULL )
{
T = malloc( sizeof( struct TreeNode ) );
if( T == NULL )
errno( "Out of space!" );
else
{
T->Element = x;
T->Left = T->Right = NULL;
}
}
else
if( x < T->Element )
T->Left = Insearch( x,T->Left );
else
if( x>T->Element )
T->Right = Insearch( x,T->Right );
return T;
}
5:Delete操作
SearchTree
Delete( Element x,SearchTree T )
{
Position TmpCell;
if( T == NULL )
Error( "Element not found!" );
else
if( x < T->Element )
T->Left=Delete( x,T->Left );
if( x > T->Element )
T->Right=Delete( x,T->Right );
else
if( T->Left && T->Right )
{
TmpCell = FindMin( T->Right );
T->Element = TmpCell->Element;
T->Right = Delete( T->Element,T->Right );
}
else
{
TmpCell = T;
if( T->Left == NULL )
T = T->Right;
else
if( T->Right == NULL )
T = T->Left;
free( TmpCell );
}
return T;
}