二叉查找树

    使二叉树成为二叉查找树的性质是,对于树中的每一个节点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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值