struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
typedef int ElementType;
struct TreeNode
{
ElementType Element;
SearchTree Left;
SearchTree Right;
};
SearchTree MakeEmpty(SearchTree T)
{
if(T!=NULL)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return T;
}
/*
* if(X<T->Element)
return Find(X,T->Left);
else if(X>T->Element)
return Find(X,T->Right);
*递归的每一层都返回值X的指针,最终函数返回的是指向值X的指针
*/
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;
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结束本次递归的Insert函数,由于T->Left=Insert(X,T->Left);T->Right=Insert(X,T->Right);
*有指针赋值情况,将T层层往上,递归最后一层指向了根节点,所以函数返回根节点的指针。
*/
return T;
}
SearchTree Insert(ElementType X,SearchTree T)
{
if(T==NULL)
{
T=(struct TreeNode*)malloc(sizeof(struct TreeNode));
if(T==NULL)
printf("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)
printf("Element Not Found");
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(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;
}
void PrintDLR(SearchTree T)//先序遍历二叉查找树
{
if(T!=NULL)
{
printf("%3d\n",T->Element);
}
if(T->Left!=NULL)
PrintDLR(T->Left);
if(T->Right!=NULL)
PrintDLR(T->Right);
}
void PrintLDR(SearchTree T)//中序遍历二叉查找树
{
if(T->Left!=NULL)
{
PrintLDR(T->Left);
}
printf("%3d\n",T->Element);
if(T->Right!=NULL)
{
PrintLDR(T->Right);
}
}
void PrintLRD(SearchTree T)//后序遍历二叉查找树
{
if(T->Left!=NULL)
{
PrintLRD(T->Left);
}
if(T->Right!=NULL)
{
PrintLRD(T->Right);
}
printf("%3d\n",T->Element);
}
int main()
{
SearchTree T;
T=(struct TreeNode*)malloc(sizeof(struct TreeNode));
T->Element=9;
T->Left=T->Right=NULL;
int arr[8]={6,2,1,8,7,10,3,18};
int i;
for(i=0;i<8;++i)
{
Insert(arr[i],T);
}
// printf("%3d\n",T->Element);
printf("中序遍历:");
PrintLDR(T);
printf("先序遍历:");
PrintDLR(T);
printf("后序遍历:");
PrintLRD(T);
return 0;
}