[数据结构]: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考研数据结构全部内容,除其中使用到C引用外,全为C语言…...
openstack浅析
** OpenStack是一个由多个组件组成的开源云计算平台,每个组件都有不同的功能和用途。 ** 组件构成 以下是OpenStack中一些常见的组件及其功能: Nova:用于管理虚拟机的组件,提供了虚拟机的创建、销毁、管理等功能。 Neutron&am…...
华为OD机试Golang解题 - 特异性双端队列 | 含思路
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典文章目录 华为Od必看系列使用说明本期题目…...

代码随想录中:回溯算法的基础
回溯算法是一种暴力的搜索方式;回溯法一般与递归同时存在。 回溯法,一般可以解决如下几种问题: 组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个…...
Android kotlin 系列讲解(进阶篇)Jetpack系列之LiveData
<<返回总目录 文章目录 一、LiveData是什么二、LiveData测试一、LiveData是什么 LiveData是Jetpack提供的一种响应式编程组件,它可以包括任何类型的数据,并在数据发生变化的时候通知给观察者。LiveData特别适合与ViewModel结合在一起使用,虽然它也可以单独在别的地方…...
如何判断有向无环图:构造有向无环图
拓扑序列:可以用来判断一个有向图是否有环! 拓扑排序可以判断有向图是否存在环。我们可以对任意有向图执行上述过程,在完成后检查A序列的长度。 若A序列的长度小于图中点的数量,则说明某些节点未被遍历,进而说明图中存…...

【2022.1.3】手脱压缩壳练习(含练习exe)
【2022.1.3】手脱压缩壳练习(含练习exe) 文章目录【2022.1.3】手脱压缩壳练习(含练习exe)0、简介1、单步跟踪法(#)方法介绍(0)练习exe下载(1)、查看源程序&am…...
【异或哈希】CF855 div3 F
感觉这道题跟之前有一题特别像,都是异或哈希感觉这种题应该很典,记录一下(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年的求解两阶段鲁棒优化模型的列和约束生成算法(CC&G)被提出之后,基本没有实质性的创新,都是围绕该算法在各个领…...
C++11轻松打印本地时间
C11之前,想要获取时间并对其打印是有些困难的,因为C并没有标准时间库。想要对时间进行统计就需要调用C库,并且我们要考虑这样的调用是否能很好的封装到我们的类中。 C11之后,STL提供了 chrono 库,其让对时间的操作更加…...

Eureka - 总览
文章目录前言架构注册中心 Eureka Server服务提供者 Eureka Client服务消费者 Eureka Client总结资源前言 微服务(Microservices,一种软件架构风格)核心的组件包括注册中心,随着微服务的发展,出现了很多注册中心的解决…...
【算法设计-枚举、分治】素数、约数、质因数分解
文章目录1. 素数判定2. 素数筛选法3. 质因数分解4. 求一个数的约数5. 求两个数的最大公约数(GCD)6. 求两个数的最小公倍数(LCM)1. 素数判定 判定从 2 到sqrt(n)依次能否把 n 整除,若存在可以整除的数则说明 n 不是素数…...
【第十四届蓝桥杯】第三期模拟赛B组C++题解(待修正+持续更新-ing)
文章目录写在前面一、找最小数题目描述解题报告1、大体思路2、代码详解二、求列名题目描述解题报告1、大体思路2、代码详解三、求日期数题目描述解题报告1、大体思路2、代码详解四、取数题目描述解题报告1、大体思路2、代码详解五、最大连通分块题目描述解题报告1、大体思路2、…...

线程池和ThreadLocal详解
线程池和ThreadLocal详解线程池池化模式:线程池里的线程数量设定为多少比较合适?添加线程规则:实现原理:线程池实现任务复用的原理线程池状态:Executors 创线程池工具类手动创建(更推荐):自动创…...
[深入理解SSD系列综述 1.7] SSD固态存储市场发展分析与预测_固态存储技术发展方向(2022to2023)
前言 自2020年疫情爆发以来,远程办公、网上教育、流媒体等等应用引爆对消费电子及云服务的需求增长,全球数字化转型加速,带来了两年的闪存风光时刻。然而,进入2022年,在俄乌冲突、疫情重燃、通胀上升等一系列事件冲击下,全球经济下行风险加剧,对智能手机、PC等科技产品的…...

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

【数据结构初阶】堆排序
目录 前言 概念 堆排序的实现 1.建堆 (1)堆向上调整算法 (2)堆的向下调整算法 2. 利用堆删除思想来进行排序 3.堆排序的时间复杂度 4.源码 总结 前言 前边我们学习了堆的实现,对堆的每个接口都进行了详细的讲…...

Day5: platformDriver-1
Platform Driver (1) Linux kernel中大部分设备可以归结为平台设备,因此大部分的驱动是平台驱动(patform driver) 什么是平台设备 平台设备是linux的设备模型中一类设备的抽象。 内核中的描述: Platform devices are devices t…...

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

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

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...