查找二叉树-链表实现

对于查找二叉树,一般用来进行查找操作,其基本操作的平均时间为 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值