二叉排序树的基本操作

2023-11-14

二叉排序树的应用
利用二叉链表存储二叉排序树,输入一组任意序列,实现二叉排序树的创建、插入、删除、中序遍历。
要求:有菜单进行选择。

安排

/**
 * 2020/6/4
 * 晴朗
**/
/**
 * 二叉排序树的基本定义
 * (1) 左子树的所有节点小于根节点
 * (2) 若右子树非空,则右子树的所有节点值大于根节点
 * (3) 根节点的左右节点本身又是一个二叉排序树    ^^^敲黑板 
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define KeyType int
#define InfoType int
//
//二叉排序树的结构体定义类型
typedef struct node
{
    KeyType key;         //元素类型
    InfoType data;       //关键字项
    struct node *lchild; //左孩子指针
    struct node *rchild; //右孩子指针
} BSTNode;
/
//二叉排序树的创建和插入
//插入算法,bt插入的树,k为插入值
bool InsertBST(BSTNode *&bt, KeyType k)
{
    if (bt == NULL)
    {
        bt = (BSTNode *)malloc(sizeof(BSTNode));
        bt->key = k;
        bt->lchild = bt->rchild = NULL;
        return true;
    }
    else if (k == bt->key)
        return false;
    else if (k < bt->key)
        return InsertBST(bt->lchild, k);
    else if (k > bt->key)
        return InsertBST(bt->rchild, k);
}
///
//二叉树的创建算法
//对n个类型的树建立他的二叉树排序树
BSTNode *CreateBST(KeyType a[], int n)
{
    BSTNode *bt = NULL;
    int i = 0;
    while (i < n)
    {
        InsertBST(bt, a[i]);
        i++;
    }
    return bt;
}

//二叉排序树的查找函数
BSTNode *SearchBST(BSTNode *bt, KeyType k)
{
    if (bt == NULL || bt->key == k)
        return bt;
    if (k < bt->key)
        return SearchBST(bt->lchild, k);
    else
        return SearchBST(bt->rchild, k);
}
//查找其双亲节点的函数
BSTNode *SearchBST1(BSTNode *bt, KeyType k, BSTNode *f1, BSTNode *&f)
{
    if (bt == NULL)
    {
        f1 = NULL;
        return (NULL);
    }
    else if (k == bt->key)
    {
        f = f1;
        return bt;
    }
    else if (k < bt->key)
        return SearchBST1(bt->lchild, k, bt, f);
    else
        return SearchBST1(bt->rchild, k, bt, f);
}

//
//最完美的删除二叉排序树的函数
void Deletel(BSTNode *p, BSTNode *&r)
{
    BSTNode *q;
    if (r->rchild != NULL)
        Deletel(p, r->rchild);
    else
    {
        p->data = r->data;
        p->key = r->key;
        q = r;
        r = r->lchild;
        free(q);
    }
}
void Delete(BSTNode *&p)
{
    BSTNode *q;
    if (p->rchild == NULL)
    {
        q = p;
        p = p->lchild;
        free(q);
    }
    else if (p->lchild == NULL)
    {
        q = p;
        p = p->rchild;
        free(q);
    }
    else
        Deletel(p, p->lchild);
}

bool DeleteBST(BSTNode *&bt, KeyType k)
{
    if (bt == NULL)
        return false;
    else
    {
        if (k < bt->key)
            return DeleteBST(bt->lchild, k);
        else if (k > bt->key)
            return DeleteBST(bt->rchild, k);
        else
        {
            Delete(bt);
            return true;
        }
    }
}

//中序遍历二叉树
void inorder(BSTNode *t) //中序遍历二叉排序树
{
    if (t)
    {
        inorder(t->lchild);
        printf("%8d", t->key);
        inorder(t->rchild);
    }
}
void menu()
{
    printf("******************************************************\n");
    printf("                  二叉排序树的基本操作                 \n");
    printf("                 1.创建二叉排序树                      \n");
    printf("                 2.插入二叉排序树                      \n");
    printf("                 3.中序遍历二叉排序树                   \n");
    printf("                 4.删除二叉排序树                       \n");
    printf("                 5.退出                                \n");
    printf("******************************************************\n");
}

int main()
{
    BSTNode *Bt, *f1, *f;
    int b[100], k, e;
    int a[10];
    //Bt = CreateBST(a, 10);
    //SearchBST(Bt, 6);
    //SearchBST1(Bt, 6, f1, f);
    menu();
    printf("请操作选择:");
    scanf("%d", &k);

    while (k != 5)
    {
        switch (k)
        {
        case 1:
            int b;
            printf("请输入需要排序的数的个数:");
            scanf("%d", &b);
            
            printf("请输入你的数:");

            for(int i=0 ;i<b; i++) {
                if(i!=b-1)  scanf("%d ",&a[i]);
                else        scanf("%d",&a[i]);
            }
            Bt = CreateBST(a, b);
            printf("创建成功!\n");
            break;

        case 2:
            printf("请输入要插入的数字:");
            scanf("%d", &e);
            if (InsertBST(Bt, e) == true)
                printf("插入成功!\n");
            else
                printf("插入失败,已经存在相同的元素。\n");
            break;

        case 3:
            printf("以下是中序遍历的结果:\n");
            inorder(Bt);
            printf("\n\n");
            break;
 
        case 4:
            printf("请输入你要元素:");
            scanf("%d",&e);
            if (DeleteBST(Bt,e) == true)
                printf("删除成功\n");
            else
                printf("删除失败\n");
            break;

        default : 
            break;

        }
        system("pause");
        system("cls");
        menu();
        printf("请操作选择:");
        scanf("%d", &k);
    }

    //printf("\n\n");
    //inorder(Bt);
    //DeleteBST(Bt, 4);

    system("pause");
    return 0;
}

运行结果
在这里插入图片描述
在这里插入图片描述
最后
记得点赞
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉排序树的基本操作 的相关文章

  • 设计模式(九)组合模式

    在数据结构中 有树这么一种结构 转换到设计模式中就是组合模式 组合模式的作用就是以统一的方式处理一组具有树形结构的对象 最典型的例子就是菜单项了 一个菜单下可能包括多个菜单项 每个菜单项都可能包含其他子菜单 下面我们来实现菜单项 由于每个菜

随机推荐

  • vector排序问题

    要对vector中的自定义类型进行排序 首先需要提供一个函数bool comp const Interval a const Interval b 来定义类型的排序准则 然后调用std sort intervals begin interv
  • linux下解压zip文件

    linux自带的unzip命令可以解压windows下的zip格式的压缩文件 unzip命令 语法 unzip 选项 压缩文件名 zip 各选项的含义分别为 x 文件列表 解压缩文件 但不包括指定的file文件 v 查看压缩文件目录 但不解
  • pycharm PyQt5报错 Process finished with exit code -1073740791 (0xC0000409) 解决方法

    在写python作业的时候他突然报错了 我觉得我是对的 想法没问题系列 界面也可以出来 是我想象中的样子 但是不能进行交互 所以我怀疑是环境问题或者是什么别的 反正不是我自身原因 蜜汁自信 然后我试了一下老师上课给的例子发现可以运行 我知道
  • GT1030和730哪个好?GT1030与GT730区别对比 (全文)

    对于显卡硬件厂商来说 当属NVIDIA可谓异常活跃 我们知道在游戏领域 N卡一直占据着绝大部分市场 旗下的显卡定位也非常明确 如最新的10系显卡 今年5月份NVIDIA低调发布了定位入门级显卡 GT1030 这款显卡上市之后立马引起了不少玩
  • android图片点击全屏显示,Android浏览图片,点击放大至全屏效果

    近期做一个项目类似于QQ空间 做到照片浏览的功能 对于QQ空间中点击图片放大至全屏 感觉效果非常赞 于是也做了个类似的效果 例如以下 我不知道QQ那个是怎么做的 我的思路例如以下 首先 从图片缩略界面跳转到图片详情页面 应该是从一个Acti
  • 概率论在实际生活的例子_概率论学习笔记

    一 从古典概型开始引入概率论的基本概念 古典概型 全称古典概率模型 也叫等可能模型 是人们最早研究的概率 也是学习概率论的起点 古典概型通过随机实验获得结果 而古典概率研究的问题有两个重要特点 结果有限 可能性一致 1 结果有限 指的是实验
  • C语言以字符形式读写文件

    一 字符读取函数 fgetc 一 函数介绍 fgetc 是 file get char 的缩写 意思是从指定的文件中读取一个字符 函数原型为 int fgetc FILE fp fp 为文件指针 fgetc 读取成功时返回读取到的字符 读取
  • Maven快速搭建GUI项目

    一 eclipse安装好maven插件 并将maven集成到eclipse之后 用maven的archetype 搭建好一个maven archetype queckstart项目的骨架 二 可执行jar文件分为两种 一种是可通过命令行ja
  • 【R语言】实验四 数据分析

    系列文章目录 实验一 R 语言数据结构 数据导入与数据处理 实验二 基本数据处理 实验三 数据可视化 实验四 数据分析 实验五 综合应用 实验数据 实验数据下载 1 hospital data 数据集 数据是关于一些医院的基础信息 数据包含
  • 如何降低APP卸载率?这里有七个方法

    如何降低APP卸载率 这里有七个方法 A A admin 2017 年 1 月 19 日 0 597 次浏览 业内资讯 APP卸载率 现在移动应用市场红海一片 获取用户越来越难 但据了解 更让开发者们为难的是 产品的高卸载率 高卸载率是用户
  • Spring事务及事务失效的部分场景

    简介 spring 有五个事务隔离级别 ISOLATION DEFAULT ISOLATION READ UNCOMMITTED ISOLATION READ COMMITTED ISOLATION REPEATABLE READ ISOL
  • 毕业设计 单片机农业土壤酸度检测系统

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 土壤酸碱度传感器 土壤pH传感器与Arduino的硬件连接 5 软件说明 土壤pH传感器的Arduino代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难
  • Javascript--位运算符

    文章转载自 http www cnblogs com oneword archive 2009 12 23 1631039 html 1 NOT 位运算符NOT由 表示 NOT运算符的实质是对数字求负 然后减1 位运算符NOT是三步的处理过
  • LeetCode(力扣)455. 分发饼干Python

    LeetCode20 有效的括号 题目链接 代码 题目链接 https leetcode cn problems assign cookies 代码 从大遍历 class Solution def findContentChildren s
  • 华为/荣耀 Magicbook/Matebook 开机经常弹出华为智能还原

    问题描述 今年开始 笔者的Magicbook开机时就会弹出华为智能还原 如下所示 检测之后显示是正常的 于是每次都点退出 退出之后就进入了正常的Win10桌面 但是发现 笔记本电脑存在以下问题 有线网络无法连接 网络里面只有无线WiFi可以
  • Nginx教程:配置TCP/IP转发

    安装nginx服务 检查是否编译时带with stream参数 nginx V grep with stream 有with stream参数 可以代理tcp协议 配置nginx的tcp代理 请注意 stream块和http块是两个不同的模
  • python和易语言的脚本哪门更实用?

    前言 每天我们都会面临许多需要高级的编程挑战 你不能用简单的 Python 基本语法来解决这些问题 在本文中 我将分享 13 个高级 Python 它们可以成为你项目中的便捷工具 如果你目前还用不到这些脚本 你可以先添加收藏 以备留用 文末
  • 使用cesium给地图实例添加精灵图图标

    前置条件 1 将精灵图存放在本地文件中 2 拿到对应的声明文件 该文件中存放了每一个类型的地图实例对应的图标在精灵图中的位置 我这里是json文件 这是某一个实例模型对应的数据 我的做法是 系统登录之后 就掉接口获取到该json文件 并存储
  • 云安全技术——Snort安装与配置

    目录 一 Snort简介 二 安装Centos7 Minimal系统 三 基本环境配置 四 安装Snort 五 下载规则 六 配置Snort 七 测试Snort 一 Snort简介 Snort是一个开源的网络入侵检测系统 主要用于监控网络数
  • 二叉排序树的基本操作

    二叉排序树的应用 利用二叉链表存储二叉排序树 输入一组任意序列 实现二叉排序树的创建 插入 删除 中序遍历 要求 有菜单进行选择 安排 2020 6 4 晴朗 二叉排序树的基本定义 1 左子树的所有节点小于根节点 2 若右子树非空 则右子树