对于查找二叉树,一般用来进行查找操作,其基本操作的平均时间为 O(log N)。
下面给出查找二叉树的链表实现,该查找二叉树中所有的元素互异,在插入时若树种已经有了具有相同关键字的元素,不做任何操作。
代码如下:
struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
struct TreeNode
{
ElementType Element;
SearchTree Left;
SearchTree Right;
};
SearchTree MakeEmpty( SearchTree );
SearchTree Insert( ElementType X, SearchTree T );
SearchTree Delete( ElementType X, SearchTree T );
Position Find( ElementType X, SearchTree T );
Position FindMin( SearchTree T );
Position FindMax( SearchTree T );
SearchTree MakeEmpty( SearchTree T )
{
if ( T != NULL )
{
MakeEmpty( T->Left );
MakeEmpty( T->Right );
free( T );
}
return NULL;
}
SearchTree Insert( ElementType X, SearchTree T )
{
if ( T == NULL )
{
T = ( Position )malloc( sizeof(struct TreeNode) );
if ( T == NULL )
{
printf( "Out of space" );
return NULL;
}
else
{
T->Element = X;
T->Left = T->Right = NULL;
}
}
else
if ( X < T->Element )
T->Left = Insert( X, T->Left );
else
if ( X > T->Element )
T->Right = Insert( X, T->Right );
// 若 X = X->Element, 不处理
return T;
}
SearchTree Delete( ElementType X, SearchTree T )
{
Position TmpCell;
if ( T == NULL )
{
printf( "Element not found" );
return NULL;
}
else
if ( X < T->Element )
T->Left = Delete( X, T->Left );
else
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( TmpCell->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;
}
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;
}
Position FindMax( SearchTree T )
{
if ( T == NULL )
return NULL;
else
if( T->Right == NULL )
return T;
else
return FindMax( T->Right );
}
Position FindMin( SearchTree T )
{
while ( T != NULL )
if ( T->Left != NULL )
T = T->Left;
return T;
}