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