问题描述
编写算法实现对依次输入的关键字序列建立二叉排序树,并能实现二叉排序树的查找、插入和删除运算。
需求分析
- 建立二叉树
- 查找关键字
- 插入关键字
- 删除关键字
- 查看树
算法思想
创建二叉排序树的第一步就是将二叉排序树初始化为空树,然后读入关键字,执行插入操作,直到输入的关键字是结束标志为止;插入操作为当二叉排序树为空时,将待插入节点作为根结点插入到空树中,若树非空,则将输入的key值与根结点的关键字进行比较,key小于T->data.key,则将key插入左子树,key大于T->data.key,则将key插入到右子树;查找操作为若二叉排序树为空,则查找失败,返回空指针,若非空,则令key值与根结点的关键字比较,相等则查找成功,小于T->data.key则递归查找左子树,大于T->data.key则递归查找右子树;删除操作因为被删除的结点可能是二叉排序树中的任何结点,删除结点后,要根据其位置不同修改其双亲结点及相关结点的指针。查看树操作采用中序遍历。
算法设计
1、菜单显示void menu()——供用户选择的功能菜单。
2、查看树void AllPrint(BSTree T)——采用树的中序遍历。
3、插入void InsertBST(BSTree &T,DataType e)——当二叉排序树为空时,将待插入节点作为根结点插入到空树中,若树非空,则将输入的key值与根结点的关键字进行比较,key小于T->data.key,则将key插入左子树,key大于T->data.key。则将key插入到右子树。
4、建立void CreateBST(BSTree &T)——第一步就是将二叉排序树初始化为空树,然后读入关键字,执行插入操作,直到输入的关键字是结束标志为止。
5、查找BSTree BSTSearch(BSTree T,int key)——若二叉排序树为空,则查找失败,返回空指针,若非空,则令key值与根结点的关键字比较,相等则查找成功,小于T->data.key则递归查找左子树,大于T->data.key则递归查找右子树。
6、删除void BSTDelete(BSTree &T)——因为被删除的结点可能是二叉排序树中的任何结点,删除结点后,要根据其位置不同修改其双亲结点及相关结点的指针。
7、主函数int main()——使用while循环和switch对功能进行调用,使用清屏函数,使界面更美观。
代码实现
#include<stdio.h>//二叉排序树
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct{
int key;
char str[10];
}DataType;
typedef struct BSTode
{
DataType data;
struct BSTode *lchild,*rchild;
}BSTode,*BSTree;
void menu(){
cout<<"***********二叉排序树的操作***********"<<endl;
cout<<" 1、建立"<<endl;
cout<<" 2、查找"<<endl;
cout<<" 3、插入"<<endl;
cout<<" 4、删除"<<endl;
cout<<" 5、查看树"<<endl;
cout<<" 6、退出"<<endl;
cout<<"**************************************"<<endl;
}
void AllPrint(BSTree T){//查看树
if(T!=NULL)
{
if(T->lchild!=NULL)
AllPrint(T->lchild);
cout<<T->data.key<<" "<<T->data.str<<endl;
if(T->rchild!=NULL)
AllPrint(T->rchild);
}
}
void InsertBST(BSTree &T,DataType e){//插入
if(T==NULL){
BSTree S=new BSTode;
S->data=e;
S->lchild=S->rchild=NULL;
T=S;
}
else if(e.key<=T->data.key)
InsertBST(T->lchild,e);
else if(e.key>T->data.key)
InsertBST(T->rchild,e);
}
void CreateBST(BSTree &T){//建立
T=NULL;
DataType e;
cout<<"请输入关键字及名称(以-1结束输入):"<<endl;
while(scanf("%d",&e.key)!=EOF)
{
if(e.key==-1)
break;
cin>>e.str;
InsertBST(T,e);
}
cout<<"创建成功!"<<endl;
}
BSTree BSTSearch(BSTree T,int key){//查找
if(T!=NULL&&key==T->data.key)
return T;
else if(key<T->data.key)
return BSTSearch(T->lchild,key);
else
return BSTSearch(T->rchild,key);
}
void BSTDelete(BSTree &T){//删除
BSTree p=T,f=NULL,q,s;
int key;
cout<<"请输入要删除的关键字:";
cin>>key;
while(p!=NULL){
if(p->data.key==key)break;
f=p;
if(p->data.key>key)p=p->lchild;
else p=p->rchild;
}
if(p==NULL)return;
q=p;
if((p->lchild)&&(p->rchild))
{
s=p->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
p->data=s->data;
if(q!=p)
q->rchild=s->lchild;
else
q->lchild=s->lchild;
delete s;
return;
}
else if(p->lchild==NULL)
p=p->rchild;
else if(p->rchild==NULL)
p=p->lchild;
if(f==NULL)
T=p;
else if(q==f->lchild)
f->lchild=p;
else f->rchild=p;
delete q;
cout<<"删除成功!"<<endl;
}
int main(){
BSTree T;
int m,t;
while(m!=6){
menu();
cin>>m;
switch(m){
case 1:
CreateBST(T);
break;
case 2:
cout<<"请输入要查找的关键字:";
cin>>t;
cout<<"查找成功!"<<endl;
cout<<"关键字:"<<BSTSearch(T,t)->data.key<<endl;
cout<<"名称:"<<BSTSearch(T,t)->data.str<<endl;
break;
case 3:
cout<<"请输入要插入的关键字及名称:";
DataType c;
cin>>c.key>>c.str;
InsertBST(T,c);
cout<<"插入成功!"<<endl;
break;
case 4:
BSTDelete(T);
break;
case 5:
AllPrint(T);
break;
case 6:
cout<<"感谢使用!"<<endl;
return 0;
default:
cout<<"没有该选项!"<<endl;
break;
}
system("pause");
system("cls");
}
return 0;
}