数据结构课设——二叉排序树的基本操作

问题描述

编写算法实现对依次输入的关键字序列建立二叉排序树,并能实现二叉排序树的查找、插入和删除运算。

需求分析

  • 建立二叉树
  • 查找关键字
  • 插入关键字
  • 删除关键字
  • 查看树

算法思想

创建二叉排序树的第一步就是将二叉排序树初始化为空树,然后读入关键字,执行插入操作,直到输入的关键字是结束标志为止;插入操作为当二叉排序树为空时,将待插入节点作为根结点插入到空树中,若树非空,则将输入的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;
}

猜你喜欢

转载自blog.csdn.net/DEAR_CXN/article/details/86556239