数据结构(C语言)课设8——二叉排序树的基本应用

数据结构(C语言)课设8——二叉排序树的基本应用

题目描述:

编写算法实现对依次输入的关键字序列建立二叉排序树,并能实现二叉排序树的查找、插入和删除运算。
#include <iostream>
using namespace std;
typedef struct
{
    int key;
    int otherInfo;
}keyInfo;
typedef struct BSTNode
{
    keyInfo data;
    struct BSTNode *lchild, *rchild;
}BSTNode, *BSTree;//定义二叉排序树的结点
BSTree SearchBST(BSTree &T, int key)//查找 若查找不到则返回空指针
{
    if(!T || key == T->data.key) return T;//为空或找到
    else if(key < T->data.key) return SearchBST(T->lchild, key);//小于 遍历左子树
    else return SearchBST(T->rchild, key);//遍历右子树
}
void InsertBST(BSTree &T, int &e)//插入
{
    BSTNode *S;
    if(!T)//递归直到为空
    {
        S = new BSTNode;//定义新结点
        S->data.key = e;//赋给新结点的数据域
        S->lchild = S->rchild = NULL;//新结点指针域置空
        T = S;
    }
    else if(e < T->data.key)//递归遍历
        InsertBST(T->lchild, e);
    else if(e > T->data.key)
        InsertBST(T->rchild, e);
}
void CreateBST(BSTree &T)//创建
{
    int e;
    T = NULL;
    cout<<"请输入要排序的数据(以-1作为结束标志): ";
    while(cin>>e)
    {
        if(e != -1)
        {
            InsertBST(T, e);
        }
        else
            break;
    }
}
void FiOrderTraverse(BSTree &T){//先序遍历二叉树的递归算法
    BSTNode *p;
    p = T;
    if(p){
        cout<<p->data.key<<" ";
        FiOrderTraverse(p->lchild);
        FiOrderTraverse(T -> rchild);
    }
}
void DeleteBST(BSTree &T, int &e)//删除
{
    BSTNode *p, *s, *q, *f;
    p = T; f = NULL;
    while(p)//不
    {
        if(p->data.key == e) break;//找到跳出循环
        f = p;
        if(p->data.key > e)  p = p->lchild;//遍历找
        else p = p->rchild;
    }
    if(!p)  cout<<"没找到"<<endl;
    //以上为查找
    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;
    }
    else if(!p->rchild)//没有右子树
    {
        p = p->lchild;
    }
    else if(!p->lchild)
    {
        p = p->rchild;
    }
    if(!f) T = p;
    else if(q == f->lchild) f->lchild = p;
    else f ->rchild = p;
    delete q;
}
int main()
{
    BSTNode *T;
    int e;
    CreateBST(T);
    cout<<"先序遍历输出创建好的二叉排序树为: "<<endl;
    FiOrderTraverse(T);cout<<endl;
    cout<<"请输入要增加的数据:"; cin>>e;
    InsertBST(T, e);
    cout<<"增加后的二叉排序树为(先序): "<<endl;
    FiOrderTraverse(T);cout<<endl;
    cout<<"请输入要删除的数据:"<<endl; cin>>e;
    DeleteBST(T, e);
    cout<<"删除后的二叉排序树为(先序): "<<endl;
    FiOrderTraverse(T);cout<<endl;
    cout<<"请输入要查询的数据: "; cin>>e;
    if(SearchBST(T, e) == NULL)
    {
        cout<<"查找失败!";
    }
    else
    {
        cout<<"查询成功二叉排序树有此数据 : "<<SearchBST(T, e)->data.key;
    }
    return 0;
}

此博文只用于记录博主学习过程(有问题可评论)

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包括代码和课程设计报告。 摘要……………………………………………………………………………………………1 1 引言…………………………………………………………………………………………2 1.1 问题的提出………………………………………………………………………………2 1.2 C语言……………………………………………………………………………………2 1.3 C语言的发展过程………………………………………………………………………2 1.4 任务与分析………………………………………………………………………………2 2设计方案……………………………………………………………………………………3 2.1整体设计方案……………………………………………………………………………3 2.1.1主程序模块设计方案…………………………………………………………………3 2.1.2初始化模块设计方案…………………………………………………………………3 2.1.3中序遍历模块设计方案………………………………………………………………5 2.1.4先序遍历模块设计方案………………………………………………………………5 2.1.5查找并删除元素模块设计方案………………………………………………………6 2.1.6主函数模块设计方案…………………………………………………………………7 3程序演示……………………………………………………………………………………9 总结…………………………………………………………………………………………10 致谢…………………………………………………………………………………………11 参考文献……………………………………………………………………………………12 附录…………………………………………………………………………………………13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值