第十三周 【项目1 - 验证算法之二叉排序树】_用括号法表示二叉排序树-程序员宅基地

技术标签: 第十三周  

/*  

*Copyright  (c)2017,烟台大学计算机与控制工程学院      

*All rights reservrd.            

*作者:赵楷文 

*完成时间:2017年11月26日      

*版本号:v1.0 

*问题描述:通过以下几种方式验证二叉排序树

(1)由整数序列{43,52,75,24,10,38,67,55,63,60}构造二叉排序树;  
(2)输出用括号法表示的二叉排序树; 
(3)用递归算法和非递归算法查找关键字55;  
(4)分别删除43和55,输出删除后用括号法表示的二叉排序树。

#include <stdio.h>
#include <malloc.h>
typedef int KeyType;
typedef char InfoType[10];
typedef struct node                 //记录类型
{
    KeyType key;                    //关键字项
    InfoType data;                  //其他数据域
    struct node *lchild,*rchild;    //左右孩子指针
} BSTNode;

//在p所指向的二叉排序树中,插入值为k的节点
int InsertBST(BSTNode *&p,KeyType k)
{
    if (p==NULL)                        //原树为空, 新插入的记录为根结点
    {
        p=(BSTNode *)malloc(sizeof(BSTNode));
        p->key=k;
        p->lchild=p->rchild=NULL;
        return 1;
    }
    else if (k==p->key)                 //树中存在相同关键字的结点,返回0
        return 0;
    else if (k<p->key)
        return InsertBST(p->lchild,k);  //插入到*p的左子树中
    else
        return InsertBST(p->rchild,k);  //插入到*p的右子树中
}

//由有n个元素的数组A,创建一个二叉排序树
BSTNode *CreateBST(KeyType A[],int n)   //返回BST树根结点指针
{
    BSTNode *bt=NULL;                   //初始时bt为空树
    int i=0;
    while (i<n)
    {
        InsertBST(bt,A[i]);             //将关键字A[i]插入二叉排序树T中
        i++;
    }
    return bt;                          //返回建立的二叉排序树的根指针
}

//输出一棵排序二叉树
void DispBST(BSTNode *bt)
{
    if (bt!=NULL)
    {
        printf("%d",bt->key);
        if (bt->lchild!=NULL || bt->rchild!=NULL)
        {
            printf("(");                        //有孩子结点时才输出(
            DispBST(bt->lchild);                //递归处理左子树
            if (bt->rchild!=NULL) printf(",");  //有右孩子结点时才输出,
            DispBST(bt->rchild);                //递归处理右子树
            printf(")");                        //有孩子结点时才输出)
        }
    }
}

//在bt指向的节点为根的排序二叉树中,查找值为k的节点。找不到返回NULL
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)
{
    while (bt!=NULL)
    {
        if (k==bt->key)
            return bt;
        else if (k<bt->key)
            bt=bt->lchild;
        else
            bt=bt->rchild;
    }
    return NULL;
}

void Delete1(BSTNode *p,BSTNode *&r)  //当被删*p结点有左右子树时的删除过程
{
    BSTNode *q;
    if (r->rchild!=NULL)
        Delete1(p,r->rchild);   //递归找最右下结点
    else                        //找到了最右下结点*r
    {
        p->key=r->key;          //将*r的关键字值赋给*p
        q=r;
        r=r->lchild;            //直接将其左子树的根结点放在被删结点的位置上
        free(q);                //释放原*r的空间
    }
}

void Delete(BSTNode *&p)   //从二叉排序树中删除*p结点
{
    BSTNode *q;
    if (p->rchild==NULL)        //*p结点没有右子树的情况
    {
        q=p;
        p=p->lchild;            //直接将其右子树的根结点放在被删结点的位置上
        free(q);
    }
    else if (p->lchild==NULL)   //*p结点没有左子树的情况
    {
        q=p;
        p=p->rchild;            //将*p结点的右子树作为双亲结点的相应子树
        free(q);
    }
    else Delete1(p,p->lchild);  //*p结点既没有左子树又没有右子树的情况
}

int DeleteBST(BSTNode *&bt, KeyType k)  //在bt中删除关键字为k的结点
{
    if (bt==NULL)
        return 0;               //空树删除失败
    else
    {
        if (k<bt->key)
            return DeleteBST(bt->lchild,k); //递归在左子树中删除为k的结点
        else if (k>bt->key)
            return DeleteBST(bt->rchild,k); //递归在右子树中删除为k的结点
        else
        {
            Delete(bt);     //调用Delete(bt)函数删除*bt结点
            return 1;
        }
    }
}
int main()
{
    BSTNode *bt;
    int n=12,x=46;
    KeyType a[]= {25,18,46,2,53,39,32,4,74,67,60,11};
    bt=CreateBST(a,n);
    printf("BST:");
    DispBST(bt);
    printf("\n");
    printf("删除%d结点\n",x);
    if (SearchBST(bt,x)!=NULL)
    {
        DeleteBST(bt,x);
        printf("BST:");
        DispBST(bt);
        printf("\n");
    }
    return 0;

}

程序测试:



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/z249486888/article/details/78639174

智能推荐

45. XSS篇——XSS过滤绕过技巧_xss编码后为啥还需要过滤特殊字符-程序员宅基地

文章浏览阅读2w次,点赞10次,收藏56次。无意中发现了一个巨牛巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,小白也能学,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家。点这里可以跳转到教程!改变大小写在测试过程中,我们可以改变测试语句的大小写来绕过XSS规则:比如:<script>alert(“xss”);</script>可以..._xss编码后为啥还需要过滤特殊字符

好心情患者故事|致抑郁症患者:我们能被治愈,也值得被爱-程序员宅基地

文章浏览阅读264次。她会因为我接了奶奶的电话而打我,会因为我没戴钥匙回家,骂我一个小时,而弟弟没戴钥匙却不骂,我问她为什么,她说弟弟只是把钥匙忘在家里,你把钥匙落在学校,别人会拿走钥匙开我们家的门。再说说我奶奶吧,长期以来,她一直是我精神上的依赖,小时候是她带大我的,她也是最疼我的人,不过也是近几年才突然意识到,她无休止的抱怨生活,抱怨婆媳矛盾,这些事情同样影响我的情绪。最开始时,我抽签抽到了一个环境很差的宿舍,后来我和辅导员沟通换了一间稍微好点的宿舍,叫上了我在大学认识的第一个朋友,但她却成为了我的噩梦。

善睐物联:揭秘物联网卡如何推动农业发展,实现绿色增长?-程序员宅基地

文章浏览阅读327次,点赞8次,收藏10次。通过物联网卡的连接,农业生产过程中的各类设备和机器可以实现互联互通,实现智能化的农业管理和控制。例如,根据农民所种植的作物和农田的特点,物联网卡可以提供针对性的施肥、植保和病虫害防治等技术服务,帮助农民解决实际问题。通过物联网卡的连接和监控,农业生产中的各种数据可以实时采集和传输,从而实现对农田、作物、气象等信息的全面监测和管理。相信随着物联网技术的不断成熟和普及,物联网卡将在农业领域发挥越来越重要的作用,推动农业的现代化和可持续发展。物联网卡作为物联网技术的重要组成部分,为农业提供了新的发展机遇和前景。

MySQL的视图-程序员宅基地

文章浏览阅读890次,点赞23次,收藏14次。某些视图是可更新的。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。修改视图是指修改数据库中已存在的表的定义。当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。删除视图时,只能删除视图的定义,不会删除数据。

[附源码]Python计算机毕业设计Django预约挂号app_django挂号预约-程序员宅基地

文章浏览阅读190次。项目运行环境配置:Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+Navicat11+Django+nodejs。项目技术:django + python+ Vue 等等组成,B/S模式 +pychram管理等等。环境需要1.运行环境:最好是python3.7.7,我们在这个版本上开发的。其他版本理论上也可以。2.pycharm环境:pycharm都可以。推荐pycharm社区版;3.mysql环境:建议是用5.7版本均可4.硬件_django挂号预约

WSL安装以及升级WSL2_wsl set version 2-程序员宅基地

文章浏览阅读2.5k次。主要是记录自己第一次安装WSL的过程,以及碰到的许多坑。1.WSL安装(后续用命令转换为WSL2)win10环境下安装WSL非常简单,在Microsoft Store里搜索Ubuntu随意选择一个进行安装即可,这里我选择了Ubuntu 20.04。第一次进入会出现提示没有打开WSL,需要启动后重试在控制面板-->程序和功能页面找到Windows 功能,在Windows 功能窗口中勾选适用于 Linux 的 Windows 子系统功能,点击确定,并按照提..._wsl set version 2

随便推点

Tomcat的startup.bat启动后显示乱码的处理方法_tomcat start.bat乱码-程序员宅基地

文章浏览阅读3.1k次,点赞4次,收藏2次。打开tomcat文件夹到conf目录下修改logging.properties找到java.util.logging.ConsoleHandler.encoding = utf-8这行更改为java.util.logging.ConsoleHandler.encoding = GBK就可以了!转自:作者:勇敢的小蜗牛来源:CSDN原文:https://blog.csdn.net..._tomcat start.bat乱码

Java 2实用教程(第5版)实验指导与习题解答 第2章-上机实践-基本数据类型与数组_java 2实用教程实验指导与习题解答-程序员宅基地

文章浏览阅读2.8k次,点赞5次,收藏12次。Java 2实用教程(第5版)实验指导与习题解答 第2章-上机实践-基本数据类型与数组实验一、输出希腊字母实验目的实验要求程序效果示例实验代码运行截图实验二、数组的引用与元素实验目的实验要求程序效果示例实验代码运行截图实验三、遍历与复制数组实验一、输出希腊字母实验目的本实验的目的是让学生掌握 char 型数据和 int 型数据之间的互相转换,同时了解 Unicode字符表。实验要求编写一个 Java 应用程序,该程序在命令行窗口输出希腊字母表。程序效果示例程序运行效果如图 2.1 所示。_java 2实用教程实验指导与习题解答

【Java基础教程】标识符与关键字_java编程基础头歌关键字标识符-程序员宅基地

文章浏览阅读571次,点赞18次,收藏22次。1、看视频进行系统学习这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。2、读源码,看实战笔记,学习大神思路“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。

Java8 Collectors类详解(一)_collectors.tocollection-程序员宅基地

文章浏览阅读4.2k次。Collectors类是用于对流进行收集和汇总的工具类。它提供了许多方法来对流进行分组、统计、转换、分区、连接、归约等操作,使得处理集合类数据变得更加方便。在使用Collectors类时,我们可以通过调用其中的方法来实现对流的不同处理方式。例如,将流中的元素收集到一个 List 中,可以使用toList()方法;按照指定条件进行分组,可以使用方法;统计流中的元素个数,可以使用counting()方法等等。此外,Collectors类还支持自定义收集器,即我们可以根据自己的需求来编写实现了。_collectors.tocollection

Docker安装部署ShardingProxy详细教程_shardingsphere-proxy单库搭建-程序员宅基地

文章浏览阅读1.1k次。本篇文章主要讲解了Docker安装部署ShardingProxy详细教程,实操过程非常重要,大家一定要动手亲自实践一下,必须掌握。下节预告,ShardingProxy实战之读写分离,大家敬请期待呦!!!。_shardingsphere-proxy单库搭建

Django自带的用户认证模块auth auth.authenticate_django oauth_authenticated-程序员宅基地

文章浏览阅读378次。推荐学习链接:https://www.cnblogs.com/Zzbj/p/9984783.html_django oauth_authenticated

推荐文章

热门文章

相关标签