您的位置:首页 > 其它

二叉查找树的各种操作

2016-03-13 22:07 309 查看
作    者:王鹏
* 完成日期: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);
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 查找