当前位置: 首页 > news >正文

[数据结构]:10-二叉排序树(无头结点)(C语言实现)

目录

前言

已完成内容

二叉排序树实现

01-开发环境

02-文件布局

03-代码

01-主函数

02-头文件

03-BinarySearchTreeCommon.cpp

04-BinarySearchTreeFunction.cpp

结语


前言

        此专栏包含408考研数据结构全部内容,除其中使用到C++引用外,全为C语言代码。使用C++引用主要是为了简化指针的使用,避免二重指针的出现。

已完成内容

[数据结构]:01-顺序表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:02-单链表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:03-栈(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:04-循环队列(数组)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:05-循环队列(链表)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:06-队列(链表带头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:07-二叉树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:08-顺序查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:09-二分查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

二叉排序树实现

01-开发环境

        语言:C/C++14

        编译器:MinGW64

        集成开发环境:CLion2022.1.3

02-文件布局

        请在CLion集成开发环境中创建C++可执行程序,否则无法运行,原因上面已解释。

                        ​​ 

03-代码

01-主函数

        用于测试二叉排序树的创建、查找、删除。

        其中创建、查找使用了两种方式实现。一种是非递归形式(for循环),另一种是递归形式。

#include "./Head/BinarySearchTreeData.h"
#include "./Source/BinarySearchTreeCommon.cpp"
#include "./Source/BinarySearchTreeFunction.cpp"int main() {// 创建BinaryTree BST = NULL;int data[7] = {54, 20, 66, 40, 28, 79, 58};int Length = 7;BinarySearchTreeCreate(BST, data, Length);InOrderTraversalTree(BST); // 有小到大printf("\n");// 查找BinaryTree OutputTree;OutputTree = BinarySearchTreeSearch(BST, 66);if (OutputTree) {printf("Value = %d\n", OutputTree->data);} else {printf("Not Find.\n");}// 递归创建BinaryTree BST1 = NULL;BinarySearchTreeRecursionCreate(BST1, data, Length);InOrderTraversalTree(BST1); // 有小到大printf("\n");// 查找OutputTree = BinarySearchTreeRecursionSearch(BST1, 66);if (OutputTree) {printf("Value = %d\n", OutputTree->data);} else {printf("Not Find.\n");}// 删除BinarySearchTreeRecursionDelete(BST, 66);InOrderTraversalTree(BST);printf("\n");return 0;
}

02-头文件

        用于存储结构体和常量等。

//
// Created by 24955 on 2023-03-04.
//#ifndef INC_03_BINARYSEARCH_SORT_TREE_BINARYSEARCHTREEDATA_H
#define INC_03_BINARYSEARCH_SORT_TREE_BINARYSEARCHTREEDATA_H
// 头文件
#include <stdio.h>
#include <stdlib.h>// 常量
typedef int ElemType;// 结构体
typedef struct BinaryTreeNode {ElemType data;struct BinaryTreeNode *lChild, *rChild;
} BinaryTreeNode, *BinaryTree;
#endif //INC_03_BINARYSEARCH_SORT_TREE_BINARYSEARCHTREEDATA_H

03-BinarySearchTreeCommon.cpp

        用于存储二叉排序树打印函数(中序遍历--为有序排列,从小到大)。

//
// Created by 24955 on 2023-03-04.
//
// 中序遍历
void InOrderTraversalTree(BinaryTree BTree) {/** 1. 左、自身、右*/if (BTree != NULL) {InOrderTraversalTree(BTree->lChild);printf("%3d", BTree->data);InOrderTraversalTree(BTree->rChild);}
}

04-BinarySearchTreeFunction.cpp

        用于存储二叉排序树创建、查找、删除等函数。

//
// Created by 24955 on 2023-03-04.
//
// 二叉排序树插入结点
void BinarySearchTreeInsert(BinaryTree &BST, ElemType value) {/** 1. 初始化新结点* 2. 判断是否为根节点* 3. 不为根节点比较两节点数值大小决定插入位置*/// 初始化新结点BinaryTree NewNode = (BinaryTree) calloc(1, sizeof(BinaryTreeNode));NewNode->data = value;// 循环树结点标签BinaryTree BSTLabel = BST;if (BST == NULL) {BST = NewNode;} else {// 插入结点while (BSTLabel) {if (BSTLabel->data > value) {if (BSTLabel->lChild == NULL) {BSTLabel->lChild = NewNode;break;} else {BSTLabel = BSTLabel->lChild;}} else {if (BSTLabel->rChild == NULL) {BSTLabel->rChild = NewNode;break;} else {BSTLabel = BSTLabel->rChild;}}}// 或者采用以下代码(用空间减少循环中判断,即换时间)/*BinaryTree BSTLabelParent;while (BSTLabel) {BSTLabelParent = BSTLabel;if (BSTLabel->data > value) {BSTLabel = BSTLabel->lChild;} else { // 不用考虑相等情况,408中未考过存在相同值的情况BSTLabel = BSTLabel->rChild;}}if (BSTLabelParent->data > value){BSTLabelParent->lChild = NewNode;} else {BSTLabelParent->rChild = NewNode;}*/}
}// 创建二叉排序树
void BinarySearchTreeCreate(BinaryTree &BST, const ElemType data[], int Length) {/** 1. 初始化树根* 2. 按数据值大小插入树*/// const是C语言的一种关键字,它所限定的变量是不允许被改变的// 树根BST = NULL;for (int i = 0; i < Length; i++) {BinarySearchTreeInsert(BST, data[i]);}
}// 二叉排序树查找(也可以采用递归方式)
BinaryTree BinarySearchTreeSearch(BinaryTree BST, ElemType value) {/** 1. 判断根节点值是否与待查找值相等* 2. 若相等返回根结点地址* 3. 若不相等判断是否大于当前结点值若小于BST = BST->lChild;反之大于BST = BST->rChild;* 4. 若未查到返回NULL*/while (BST) {if (BST->data == value) {return BST;} else if (BST->data > value) {BST = BST->lChild;} else {BST = BST->rChild;}}return NULL;
}/*************************** 以下为递归方式实现 *******************************/
// 递归方法插入树新结点
void BinarySearchTreeRecursionInsert(BinaryTree &BST, ElemType value) {/** 1. 判断当前结点是否为空* 2. 若为空插入* 3. 若不为空判断大小,进行递归*/if (BST == NULL) {// 初始化新结点BinaryTree NewNode = (BinaryTree) calloc(1, sizeof(BinaryTreeNode));NewNode->data = value;BST = NewNode;} else {if (BST->data > value) {BinarySearchTreeRecursionInsert(BST->lChild, value);} else {BinarySearchTreeRecursionInsert(BST->rChild, value);}}
}// 调用递归插入函数创建二叉排序树
void BinarySearchTreeRecursionCreate(BinaryTree &BST, const ElemType data[], int Length) {/** 1. 初始化树根* 2. 按数据值大小插入树*/// const是C语言的一种关键字,它所限定的变量是不允许被改变的// 树根BST = NULL;for (int i = 0; i < Length; i++) {BinarySearchTreeRecursionInsert(BST, data[i]);}
}void BinarySearchTreeRecursionDelete(BinaryTree &BST, ElemType value) {/** 1. 若删除元素值比当前元素值小,递归传入左孩子* 2. 若删除元素值比当前元素值大,递归传入右孩子* 3. 若相等,则判断当前元素左、右孩子是否为空* 4. 若其中任意一个为空,则将另一个替代要当前元素(要删除元素)* 5. 若都不为空,循环寻找当前元素左子树中最大值,替代当前元素值,并删除左子树中用于替代的结点*/// 防止输入的为树中未包含元素,无法停止递归if (BST == NULL) {return;}if (BST->data > value) {BinarySearchTreeRecursionDelete(BST->lChild, value);} else if (BST->data < value) {BinarySearchTreeRecursionDelete(BST->rChild, value);} else {BinaryTree FreeNode;// 若左、右孩子其中任意一个为空,则将另一个替代要当前元素(要删除元素)if (BST->lChild == NULL) {FreeNode = BST;BST = BST->rChild;free(FreeNode);} else if (BST->rChild == NULL) {FreeNode = BST;BST = BST->lChild;free(FreeNode);} else {// 左、右孩子都不为空// 一般删除策略为:左子树的最大数据 或 右子树的最小数据,替代要删除的结点// 此处采用左子树的最大数据BinaryTree TemporaryTree = BST->lChild;// 寻找左子树中的最大值while (TemporaryTree->rChild) {TemporaryTree = TemporaryTree->rChild;}// 替代,删除替代结点BST->data = TemporaryTree->data;// 此处注意不要传入TemporaryTree// 经单点调试发现,传入TemporaryTree会造成乱码(未将叶子结点设为NULL)BinarySearchTreeRecursionDelete(BST->lChild, TemporaryTree->data);}}
}// 二叉排序树查找-递归方式
BinaryTree BinarySearchTreeRecursionSearch(BinaryTree BST, ElemType value) {/** 1. 返回值为NULL或所查找到的结点*/if (BST != NULL && BST->data != value) {if (BST->data > value) {BST = BinarySearchTreeRecursionSearch(BST->lChild, value);} else {BST = BinarySearchTreeRecursionSearch(BST->rChild, value);}}return BST;
}

结语

        此博客主要用于408考研数据结构C语言实现记录,内有不足,可留言,可讨论。

相关文章:

[数据结构]:10-二叉排序树(无头结点)(C语言实现)

目录 前言 已完成内容 二叉排序树实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-BinarySearchTreeCommon.cpp 04-BinarySearchTreeFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言…...

openstack浅析

** OpenStack是一个由多个组件组成的开源云计算平台&#xff0c;每个组件都有不同的功能和用途。 ** 组件构成 以下是OpenStack中一些常见的组件及其功能&#xff1a; Nova&#xff1a;用于管理虚拟机的组件&#xff0c;提供了虚拟机的创建、销毁、管理等功能。 Neutron&am…...

华为OD机试Golang解题 - 特异性双端队列 | 含思路

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典文章目录 华为Od必看系列使用说明本期题目…...

代码随想录中:回溯算法的基础

回溯算法是一种暴力的搜索方式&#xff1b;回溯法一般与递归同时存在。 回溯法&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题&#xff1a;一个字符串按一定规则有几种切割方式子集问题&#xff1a;一个…...

Android kotlin 系列讲解(进阶篇)Jetpack系列之LiveData

<<返回总目录 文章目录 一、LiveData是什么二、LiveData测试一、LiveData是什么 LiveData是Jetpack提供的一种响应式编程组件,它可以包括任何类型的数据,并在数据发生变化的时候通知给观察者。LiveData特别适合与ViewModel结合在一起使用,虽然它也可以单独在别的地方…...

如何判断有向无环图:构造有向无环图

拓扑序列&#xff1a;可以用来判断一个有向图是否有环&#xff01; 拓扑排序可以判断有向图是否存在环。我们可以对任意有向图执行上述过程&#xff0c;在完成后检查A序列的长度。 若A序列的长度小于图中点的数量&#xff0c;则说明某些节点未被遍历&#xff0c;进而说明图中存…...

【2022.1.3】手脱压缩壳练习(含练习exe)

【2022.1.3】手脱压缩壳练习&#xff08;含练习exe&#xff09; 文章目录【2022.1.3】手脱压缩壳练习&#xff08;含练习exe&#xff09;0、简介1、单步跟踪法&#xff08;#&#xff09;方法介绍&#xff08;0&#xff09;练习exe下载&#xff08;1&#xff09;、查看源程序&am…...

【异或哈希】CF855 div3 F

感觉这道题跟之前有一题特别像&#xff0c;都是异或哈希感觉这种题应该很典&#xff0c;记录一下(66条消息) Codeforces Round #841 (Div. 2) and Divide by Zero【异或差分动态map维护】 2022 C. Even Subarrays_lamentropetion的博客-CSDN博客Problem - F - Codeforces题意&a…...

深度学习|改进两阶段鲁棒优化算法i-ccg

目录 1 主要内容 2 改进算法 2.1 CC&G算法的优势 2.2 i-CCG算法简介 3 结果对比 1 主要内容 自从2013年的求解两阶段鲁棒优化模型的列和约束生成算法&#xff08;CC&G&#xff09;被提出之后&#xff0c;基本没有实质性的创新&#xff0c;都是围绕该算法在各个领…...

C++11轻松打印本地时间

C11之前&#xff0c;想要获取时间并对其打印是有些困难的&#xff0c;因为C并没有标准时间库。想要对时间进行统计就需要调用C库&#xff0c;并且我们要考虑这样的调用是否能很好的封装到我们的类中。 C11之后&#xff0c;STL提供了 chrono 库&#xff0c;其让对时间的操作更加…...

Eureka - 总览

文章目录前言架构注册中心 Eureka Server服务提供者 Eureka Client服务消费者 Eureka Client总结资源前言 微服务&#xff08;Microservices&#xff0c;一种软件架构风格&#xff09;核心的组件包括注册中心&#xff0c;随着微服务的发展&#xff0c;出现了很多注册中心的解决…...

【算法设计-枚举、分治】素数、约数、质因数分解

文章目录1. 素数判定2. 素数筛选法3. 质因数分解4. 求一个数的约数5. 求两个数的最大公约数&#xff08;GCD&#xff09;6. 求两个数的最小公倍数&#xff08;LCM&#xff09;1. 素数判定 判定从 2 到sqrt(n)依次能否把 n 整除&#xff0c;若存在可以整除的数则说明 n 不是素数…...

【第十四届蓝桥杯】第三期模拟赛B组C++题解(待修正+持续更新-ing)

文章目录写在前面一、找最小数题目描述解题报告1、大体思路2、代码详解二、求列名题目描述解题报告1、大体思路2、代码详解三、求日期数题目描述解题报告1、大体思路2、代码详解四、取数题目描述解题报告1、大体思路2、代码详解五、最大连通分块题目描述解题报告1、大体思路2、…...

线程池和ThreadLocal详解

线程池和ThreadLocal详解线程池池化模式&#xff1a;线程池里的线程数量设定为多少比较合适?添加线程规则&#xff1a;实现原理&#xff1a;线程池实现任务复用的原理线程池状态&#xff1a;Executors 创线程池工具类手动创建&#xff08;更推荐&#xff09;&#xff1a;自动创…...

[深入理解SSD系列综述 1.7] SSD固态存储市场发展分析与预测_固态存储技术发展方向(2022to2023)

前言 自2020年疫情爆发以来,远程办公、网上教育、流媒体等等应用引爆对消费电子及云服务的需求增长,全球数字化转型加速,带来了两年的闪存风光时刻。然而,进入2022年,在俄乌冲突、疫情重燃、通胀上升等一系列事件冲击下,全球经济下行风险加剧,对智能手机、PC等科技产品的…...

【2021.12.25】ctf逆向中常见加密算法和编码识别

【2021.12.25】ctf逆向中常见加密算法和编码识别&#xff08;含exe及wp&#xff09; 文章目录【2021.12.25】ctf逆向中常见加密算法和编码识别&#xff08;含exe及wp&#xff09;0、前言1、基础加密手法2、base64&#xff08;1&#xff09;原理&#xff1a;&#xff08;2&#…...

【数据结构初阶】堆排序

目录 前言 概念 堆排序的实现 1.建堆 &#xff08;1&#xff09;堆向上调整算法 &#xff08;2&#xff09;堆的向下调整算法 2. 利用堆删除思想来进行排序 3.堆排序的时间复杂度 4.源码 总结 前言 前边我们学习了堆的实现&#xff0c;对堆的每个接口都进行了详细的讲…...

Day5: platformDriver-1

Platform Driver (1) Linux kernel中大部分设备可以归结为平台设备&#xff0c;因此大部分的驱动是平台驱动&#xff08;patform driver&#xff09; 什么是平台设备 平台设备是linux的设备模型中一类设备的抽象。 内核中的描述&#xff1a; Platform devices are devices t…...

开发手册——一、编程规约_7.控制语句

这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】在一个 switch 块内&#xff0c;每个 case 要么通过 break / return 等来终止&#xff0c;要么注释说明程序将继续执行到哪…...

python每日学9 : windows上配置gitee的远程仓库,git的初步使用

在开发中&#xff0c;如果遇到复杂的项目&#xff0c;使用版本控制是非常有必要的&#xff0c;如果涉及到多端开发&#xff0c;那么还需要使用远程仓库。本文作个简单记录&#xff0c;记录下git初步使用。 1 下载与安装 git还有几个ui版本&#xff0c;但是开始使用的话&#…...

精确率与召回率,ROC曲线与PR曲线

精确率与召回率&#xff0c;ROC曲线与PR曲线 在机器学习的算法评估中&#xff0c;尤其是分类算法评估中&#xff0c;我们经常听到精确率(precision)与召回率(recall)&#xff0c;ROC曲线与PR曲线这些概念&#xff0c;那这些概念到底有什么用处呢&#xff1f; 首先&#xff0c…...

现代操作系统——Linux架构与学习

小白的疑惑 在我决定从事嵌入式&#xff08;应用层&#xff09;方面的工作时&#xff0c;我查询了大量资料该如何学习&#xff0c;几乎所有观点不约而同的都指向了学习好Linux&#xff0c;大部分工作都是在Linux环境下来进行工作的。于是我雄心勃勃的去下载Linux&#xff0c;可…...

中文代码82

PK 嘚釦 docProps/PK 嘚釦羸 r docProps/app.xml潙蚽?勶曻Q顗濔S? 錞礖剅D柍珘m?鳞?ぷ辷f硌?2?upc厭Y樐8 rU y搪m眾&a?珪?紓 玺鶋瑣襚? ?i嘲rN?布倖儇?攊橌??嚗猝)芻矂2吟腊K湞?CK臶>鸘\?ΔF滋齢q旮T?桀?;偉 A軥v蕯朾偤佷3?е…...

顺序表(一篇带你掌握顺序表)

目录 一、顺序表是什么 1.1 概念 1.2 分类 1.3 结构 二、顺序表的基本操作 2.1 前绪准备 2.2 初始化 2.3 扩容 2.5 尾插 2.6 打印 2.7 尾删 2.8 头插 2.9 头删 2.10 在pos位置插入 2.11 删除pos位置的数据 2.12 查找 三、完整代码 3.1 Test.c文件 3.2 SeqList.h…...

【SpringCloud】SpringCloud教程之Feign实战

目录前言SpringCloud Feign远程服务调用一.需求二.两个服务的yml配置和访问路径三.使用RestTemplate远程调用(order服务内编写)四.构建Feign(order服务内配置)五.自定义Feign配置(order服务内配置)六.Feign配置日志(oder服务内配置)七.Feign调优(order服务内配置)八.抽离Feign前…...

嵌入式linux必备内存泄露检测神器

Valgrind介绍 Valgrind是一个可移植的动态二进制分析工具集&#xff0c;主要用于发现程序中的内存泄漏、不合法内存访问、使用未初始化的内存、不正确的内存释放以及性能问题等&#xff0c;可在Linux和Mac OS X等平台上使用。 Valgrind由多个工具组成&#xff0c;其中最常用的…...

设计模式之行为型模式

四、行为型模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制来在…...

解密 三岁的三岁到底为什么叫做三岁?

机缘 那一年&#xff0c;一次奇奇怪怪的挫折与一次奇奇怪怪的成长。 在学习Python的路上总觉得少了点什么&#xff0c;是心情&#xff1f;是机遇&#xff1f;还是力量&#xff1f; 都不是又都是&#xff01; 缺少一个实践和记忆的平台 记性不好是硬伤 前一天学的下一秒就忘记了…...

id选择器

id选择器可以为特定的id的标签进行css美化 使用方法&#xff1a; 标签内设好 id值&#xff0c; CSS的id选择器以“#id名”来调用 注意 所有标签都有id值id属性值类似于身份证号码&#xff0c;在一个页面中是唯一的值&#xff0c;不可重复一个标签上只能有一个id属性值一个id属性…...

《科技之巅3》读书笔记

文章目录书籍信息人工智能&#xff0c;“吃一堑长一智”的机器人机交互&#xff0c;为解决“交流障碍”问题而生硬件与算法&#xff0c;好马还需好鞍模式创新&#xff0c;赋予技术新的定义云与数据共享&#xff0c;灵活应对信息的爆发式增长“机器人”&#xff0c;从电影和小说…...