二插查找树的实现

/* Note:Your choice is C IDE */
#include "stdio.h"
#include "stdlib.h"
#include "cking.h"

#ifndef _Tree_H

struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;

SearchTree MakeEmpty( SearchTree T );
Position Find( ElementType 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

struct TreeNode {
	ElementType Element;
	SearchTree	Left;
	SearchTree	Right;
};



void main()
{
	SearchTree T = NULL;
	T = Insert( 5, T );
	T = Insert( 7, T );
	T = Insert( 3, T );
	Retrieve( T );
	    
}

SearchTree MakeEmpty( SearchTree T )
{
	if( T != NULL )
	{
		MakeEmpty( T->Left );
		MakeEmpty( T->Right );
		free( T );
	}
	return 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;
}

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;
}

SearchTree Insert( ElementType X, SearchTree T )
{
	if( T == NULL )									/*T等于空,则插入在此处*/
	{
		T = malloc( sizeof( struct TreeNode ) );
		if( T == NULL )
			FatalError( "Out of space!!!" );
		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 );			/*在右找合适的位置*/
	
	return T;										/*返回新位置*/
}

SearchTree Delete( ElementType X, SearchTree T )
{
	Position TmpCell;
	
	if( T == NULL )									/*T是空则返回空*/
		return NULL;
	else if( X < T->Element )						/*在左查找X*/
		T->Left = Delete( X, T->Left );
	else if( X > T->Element )						/*在右查找X*/
		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;
}

ElementType Retrieve( Position P )
{
	if( P == NULL)
		return 0;
	printf( "%d\n", P->Element );		/*中序输出*/
	Retrieve( P->Left );
	Retrieve( P->Right );
	return P->Element;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值