作 者:王鹏
* 完成日期:2016年 3 月 13 日
* 问题描述:二叉查找树的各种操作
* 输入描述:以0代替树的儿子为空
* 程序输出:如代码所示
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode *SearchTree;
typedef struct TreeNode *Position;
typedef int ElementType;
typedef struct TreeNode{
ElementType Element;
SearchTree Left;
SearchTree Right;
}BiTNode;
//二叉查找树的函数声明
SearchTree CreateTree(); //创建二叉树
Position Find(ElementType X, SearchTree T); //查找
Position FindMax(SearchTree T);
Position FindMin(SearchTree T);
SearchTree Insert(ElementType X, SearchTree T); //插入
SearchTree Delete(ElementType X, SearchTree T); //删除
void PreOrder_1(SearchTree T); //先序遍历(递归)
int main()
{
SearchTree T;
ElementType Element;
int flag = 1, i;
printf(" 本程序实现二叉查找树的基本操作。 \n");
while(flag){
printf("| |\n");
printf("|**********************************************************************|\n");
printf("| 二叉查找树的基本操作如下: |\n");
printf("| 0.创建二叉树 |\n");
printf("| 1.查找 |\n");
printf("| 2.插入 |\n");
printf("| 3.删除 |\n");
printf("| 4.将二叉查找树遍历 |\n");
printf("|**********************************************************************|\n");
printf("| 请选择功能: |\n");
scanf("%d", &i);
//输入需要选择的功能
switch(i){
case 0:
printf("请输入二叉树的根结点(0代表NULL):");
T = CreateTree();
break;
case 1:
if(T){
printf("请输入要查找的元素:");
scanf("%d", &Element);
if( Find(Element, T))
printf("该元素存在!\n");
else
printf("该元素不存在!\n");
}else
printf(" 二叉查找树为空!\n");
break;
case 2:
if(T){
printf("请输入要插入的元素:");
scanf("%d", &Element);
T = Insert(Element, T);
}else
printf(" 二叉查找树为空!\n");
break;
case 3:
if(T){
printf("请输入要删除的元素:");
scanf("%d", &Element);
T = Delete(Element, T);
}else
printf(" 二叉查找树为空!\n");
break;
case 4:
if(T){
printf("(先序)遍历的结果为:");
PreOrder_1(T);
printf("\n");
}else
printf(" 二叉树为空!\n");
break;
default:
flag = 0;
printf("程序运行结束,按任意键退出!\n");
}
}
return 0;
}
//二叉查找树的函数
SearchTree CreateTree() //创建二叉树
{
ElementType ch;
SearchTree T;
scanf("\n%d", &ch);
if(ch == 0)
T = NULL;
else{
if(!(T = (SearchTree)malloc(sizeof(BiTNode))))
exit(-1);
T->Element = ch;
printf("%d的左儿子为:", T->Element );
T->Left = CreateTree();
printf("%d的右儿子为:", T->Element );
T->Right = CreateTree();
}
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){
while(T->Right != NULL )
T = T->Right;
}
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) //找最小值(非递归)
{
if(T != NULL){
while(T->Left != NULL )
T = T->Left;
}
return T;
}
// Position FindMin(SearchTree T) //找最小值(递归)
//{
// if(T == NULL)
// return NULL;
// else if(T->Left == NULL)
// return T;
// else
// return FindMax(T->Left);
// }
SearchTree Insert(ElementType X, SearchTree T) //插入元素到二叉树
{
if(T == NULL){
if(!(T = malloc(sizeof(struct TreeNode))))
exit(-1);
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("没找到\n");
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 PreOrder_1(SearchTree T) //先序遍历(递归)
{
if(T){
printf("%d ", T->Element);
PreOrder_1(T->Left);
PreOrder_1(T->Right);
}
}