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

二叉搜索树的实现(递归方式)

目录

实现思路

插入操作

删除操作

完整代码

测试案例

总结


二叉搜索树(Binary Search Tree,BST)是一种常用的数据结构,它具有以下特点:

  • 左子树上所有节点的值均小于它的根节点的值
  • 右子树上所有节点的值均大于它的根节点的值
  • 左右子树也分别为二叉搜索树

在实际应用中,BST被广泛使用,例如在数据库中的索引、哈希表等。

本文将介绍如何使用递归的方式实现BST,并提供完整代码和测试案例。

实现思路

BST的基本操作包括查找、插入和删除。这里我们只讲解递归方式实现BST的插入和删除操作。

插入操作

插入操作可以分为两种方式:

  • 版本一:传入父节点,通过比较key值大小,递归向下寻找插入位置。
  • 版本二:使用引用,第一步传参时,root是_root的别名;递归过程中,root是父节点指向它的指针的别名,修改root就是修改了父节点的连接。

版本二的实现方式更加简洁,因此我们选择使用版本二来实现插入操作。

删除操作

删除操作也可以分为两种方式:

  • 版本一:传入父节点,通过比较key值大小,递归向下寻找删除节点。
  • 版本二:使用引用,第一步传参时,root是_root的别名;递归过程中,root是父节点_left或·_right的别名,修改root就是修改了父节点的连接。

版本二同样更加简洁,因此我们选择使用版本二来实现删除操作。需要注意的是,当删除节点有两个子节点时,需要先找到其左子树中最大的节点右子树中最小的节点,将其值替换到要删除的节点上,再删除左子树中最大的节点右子树中最小的节点。

无论是查找、插入、删除,如果使用递归,都需要传参根节点,通过根节点来递归处理子问题,但是在类的实现中,成员变量根节点_root是私有变量,在类外无法访问,针对这种问题,C++常见的处理方式就是套用一层接口函数,定义对应功能的私有函数提供给接口函数调用;用户直接调用接口函数,和之前没有区别,接口函数内再调用对应功能的私有函数,私有函数只在类中使用,自然就可以调用BST的私有成员_root。

完整代码

#include<iostream>
using namespace std;template <class K>
class BSTreeNode
{
public:BSTreeNode<K>* _left;BSTreeNode<K>* _right;K _key;BSTreeNode(const K& key):_left(nullptr), _right(nullptr), _key(key){ }
};template<class K>
class BSTree
{typedef BSTreeNode<K> Node;
public:bool Find(const K& key){return _Find(_root, key);}bool Insert(const K& key){return _Insert2(_root, key);}void midOrder(){_midOrder(_root);}bool Erase(const K& key){return _Erase(_root, key);}
private:Node* _root = nullptr;bool _Find(Node* root, const K& key){if (root == nullptr)return false;if (key < root->_key){return _Find(root->_left, key);}else if (key > root->_key){return _Find(root->_right, key);}else{return true;}}void _midOrder(Node* root){if (root == nullptr)return;_midOrder(root->_left);cout << root->_key << " ";_midOrder(root->_right);}bool _Insert2(Node*& root, const K& key){if (root == nullptr){root = new Node(key);return true;}if (key < root->_key)return _Insert2(root->_left, key);else if (key > root->_key)return _Insert2(root->_right, key);elsereturn false;}bool _Erase(Node*& root, const K& key){if (root == nullptr)return false;if (key < root->_key)return _Erase(root->_left, key);else if (key > root->_key)return _Erase(root->_right, key);else{if (root->_left == nullptr){Node* del = root;root = root->_right;delete del;}else if (root->_right == nullptr){Node* del = root;root = root->_left;delete del;}else{//要删除的节点有两个子节点,替换法//先找到一个合适的替换节点,然后把值替换//合适的替换节点绝对是上面的几种情况:只有左子树、只有右子树、没有子节点Node* subRight = root->_left;while (subRight->_right){subRight = subRight->_right;}swap(root->_key, subRight->_key);//交换值后,目前虽然整棵树不是搜索二叉树,但是root的左右子树都还是BST,递归去删除即可return _Erase(root->_left, key);}}return true;}
};int main()
{int a[] = { 8,3,1,6,4,7,14,13 };BSTree<int> bst;for (int x : a){bst.Insert(x);}bst.midOrder();//测试:遍历删除for (int x : a){bst.midOrder();cout << endl;bst.Erase(x);bst.midOrder();cout << endl;cout << endl;}cout << "全部删除成功" << endl;system("pause");return 0;
}

测试案例

int a[] = { 8,3,1,6,4,7,14,13 };
BSTree<int> bst;
for (int x : a)
{bst.Insert(x);
}
bst.midOrder();//测试:遍历删除
for (int x : a)
{bst.midOrder();cout << endl;bst.Erase(x);bst.midOrder();cout << endl;cout << endl;
}cout << "全部删除成功" << endl;

 构建的二叉树如下:

运行结果如下:

1 3 4 6 7 8 13 14 
1 3 4 6 7 8 13 14 
1 3 4 6 7 8 13 14 1 3 4 6 7 13 14 
1 3 4 6 7 13 14 
1 3 4 6 7 13 14 1 3 4 6 13 14 
1 3 4 6 13 14 
1 3 4 6 13 14 1 3 4 6 13 
1 3 4 6 13 
1 3 4 6 13 1 3 4 6 
1 3 4 6 
1 3 4 6 1 3 4 
1 3 4 
1 3 4 1 3 
1 3 
1 3 1 
1 
1 全部删除成功

总结

本文介绍了使用递归的方式实现BST的插入和删除操作,并提供了完整代码和测试案例。递归虽然简洁,但需要注意递归边界条件、参数传递方式等问题。在实际应用中,也可以使用迭代的方式实现BST的基本操作。

相关文章:

二叉搜索树的实现(递归方式)

目录 实现思路 插入操作 删除操作 完整代码 测试案例 总结 二叉搜索树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;是一种常用的数据结构&#xff0c;它具有以下特点&#xff1a; 左子树上所有节点的值均小于它的根节点的值右子树上所有节点的值均大于它的…...

NetCore IIS Redis JMeter 登录压力测试

近期&#xff0c;由于某项目验收需要&#xff0c;需要登录接口同时满足至少400个账号同时并发登录&#xff0c;于是开始编写测试代码&#xff0c;以满足项目业务需要。首先&#xff0c;安装jdk&#xff0c;由于本机已安装jdk8&#xff1a; 如果你机器上没有安装jdk&#xff0c;…...

进一步了解视频美颜SDK:美颜SDK的技术原理

美颜技术在当今的数字世界中变得越来越流行&#xff0c;尤其是在视频直播、社交媒体和视频通话应用中。用户寻求通过美颜效果增强自己的外观&#xff0c;这种需求催生了众多美颜SDK&#xff08;软件开发工具包&#xff09;的出现。这些SDK使开发者能够轻松地将美颜功能集成到他…...

【Qt之QSetting】介绍及使用

概述 QSettings类提供了一种持久的、与平台无关的应用程序设置存储功能。 用户通常期望一个应用能在不同会话中记住其设置&#xff08;窗口大小和位置&#xff0c;选项等&#xff09;。在Windows上&#xff0c;这些信息通常存储在系统注册表中&#xff1b;在macOS和iOS上&…...

基于WebRTC构建的程序因虚拟内存不足导致闪退问题的排查以及解决办法的探究

目录 1、WebRTC简介 2、问题现象描述 3、将Windbg附加到目标进程上分析 3.1、Windbg没有附加到主程序进程上&#xff0c;没有感知到异常或中断 3.2、Windbg感知到了中断&#xff0c;中断在DebugBreak函数调用上 3.3、32位进程用户态虚拟地址和内核态虚拟地址的划分 …...

通过jdk自制https证书并配置到nginx并配置http2

生成证书 这里使用自己生成的免费证书。在${JAVA_HOME}/bin 下可以看到keytool.exe,在改目录打开cmd然后输入&#xff1a; keytool -genkey -v -alias lgq.com -keyalg RSA -keystore d:/zj/ssl/fastfly.com.keystore -validity 3650生成证书过程中&#xff1a;【你的名字】对…...

祝贺中国煤科重庆研究院和达索、百世慧PLM项目顺利结项

引言 2023年10月17日&#xff0c;中国煤科重庆研究院与达索系统、百世慧在重庆研究院会议室召开了产品全生命周期管理&#xff08;PLM&#xff09;系统结项会。中国煤科重庆研究院科技发展部副主任孙海涛、测控技术研究分院副院长于庆、重庆大学教授鄢萍、达索公司工业装备部南…...

基于springboot实现数码论坛系统设计与实现系统【项目源码+论文说明】

基于springboot实现数码论坛系统设计与实现系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把数码论坛与现在网络相结合&#xff0c;利用java技术建设数码论坛系统&#xff0c;实现数码论坛的信息化。则对于进一步提高数码论坛发展&#xff0c;丰富数码论坛经验能起…...

魔域开服需要什么样的配置

魔域是一个非常受玩家喜欢的游戏&#xff0c;是一款大型魔幻题材的网络游戏&#xff0c;关于魔族入侵亚特大陆的故事&#xff0c;玩家在游戏里扮演不同的角色捍卫大陆安全&#xff0c;很多玩家想要更多的体验就会选择开新服&#xff0c;今天就让小编来讲一讲魔域开服要什么配置…...

7个好用的PC端设计软件,设计必看!优漫动游

身为设计师的你是不是还在为到处寻找合适的设计软件而烦恼&#xff1f;是不是在为因为没能用上好的软件而影响自己设计生涯的事情感到焦虑&#xff1f;别担心&#xff0c;你的烦恼可能每个成熟的设计师都遇到过&#xff0c;但他们最终都走了过来。借助以下7个好用的PC端设计软件…...

10-动画animation

动画animation 动画-过渡和动画之间的异同-animation-name 指定要绑定到选择器的关键帧的名称&#xff0c;告诉系统需要执行哪个动画-animation-duration 动画指定需要多少秒或毫秒完成&#xff0c;告诉系统动画持续的时长-animation-timing-function 设置动画将如何完成一个周…...

【带头学C++】----- 1.基础知识 ---- 1.24 逻辑控制语句

1.24 逻辑控制语句 本节主要学习关于C逻辑控制的一些语句的用法&#xff0c;结合实践代码总结一下。 1.24.1 if以及if - else&#xff08;条件语句&#xff09; 1.if语句&#xff1a; if(条件){执行语句; }//一旦执行if语句&#xff0c;先判断()里的条件是否满足&#xff0c…...

微信公众号分销商城源码系统+多元商家+收银台 带完整的搭建教程

给大家推荐一款微信公众号分销商城源码系统&#xff0c;这是一个全新三级分销商城&#xff0c;功能十分丰富。一起来看看你吧。 微信公众号分销商城的功能&#xff1a; 1.商品展示和推广&#xff1a;商家可以在商城中展示商品信息&#xff0c;包括商品名称、价格、库存等&#…...

排序算法:选择排序,分别用c++、java、python实现

选择排序介绍 选择排序&#xff08;Selection Sort&#xff09;是一种简单的比较排序算法&#xff0c;它的工作原理如下&#xff1a; 分区: 将待排序的数组分成两个部分&#xff0c;一个部分是已排序的子数组&#xff0c;另一个部分是未排序的子数组。初始时&#xff0c;已排序…...

支付宝支付接入流程

一、 接入准备 支付宝支付流程没有微信那么复杂&#xff0c;而且支付宝支持沙箱。登录支付宝开放平台控制台 点击开发工具中的沙箱 接口加密方式&#xff0c;我这里使用的是自定义密钥。生成密钥的方式 使用支付宝官方提供的密钥工具&#xff0c;唯一要注意的是支付宝密钥工具…...

管理员|顾问必看!8个Salesforce权限集的最佳实践

Salesforce中的权限一直始终是热门话题。权限集是简档的附加。它们通常具有相同的设置&#xff0c;用于增加用户的权限&#xff0c;使其超过简档提供的权限。可以将简档视为许多用户共有的基本权限集&#xff0c;而权限集是部分用户需要的额外权限。 本篇文章将介绍Salesforce…...

【linux进程(六)】环境变量再理解程序地址空间初认识

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 程序地址空间 1. 前言2. 在ba…...

10步开启SAFe敏捷发布列车

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 敏捷畅想一、培训 SAFe 项目顾问 (SPC)二、培训精益敏捷领导者三、 举办价值流研讨会并确定您的第一个敏捷发布系列四、 定义/设置 ART 和团队五、 担任重要角色六、…...

面试题之Vue和React的区别是什么?

一提到前端框架&#xff0c;相信大家都对Vue和React不陌生&#xff0c;这两个前端框架都是比较主流的&#xff0c;用户也都比较多&#xff0c;但是我们在使用这些框架的时候&#xff0c;是否对这两个框架之间的区别有所了解呢&#xff1f;接下来&#xff0c;让我们来一起的系统…...

Linux基础知识——概述和常用文件管理命令

Linux基础知识——概述和常用文件管理命令 文章目录 Linux基础知识——概述和常用文件管理命令概述常用的一些文件指令 概述 终端&#xff1a;一个terminal窗口就是以个屏幕, 远程连接了一个服务器, 每一个terminal可以连接到任何一个其他服务器上;关掉terminal相当于只是关掉…...

加油卡小程序玩法全解析:刚需场景破局,从充值裂变到合规运营全攻略

国内私家车与新能源车主群体持续扩容&#xff0c;加油、充电作为高频刚性消费场景&#xff0c;自带稳定流量与强付费意愿&#xff0c;加油卡小程序凭借轻量化、易传播、直达用户的优势&#xff0c;成为加油站、第三方车主服务平台、车企布局私域流量的核心载体。不同于潮玩等娱…...

Xinference-v1.17.1智能家居控制系统开发

Xinference-v1.17.1智能家居控制系统开发 1. 智能家居控制新体验 想象一下&#xff0c;早上醒来窗帘自动拉开&#xff0c;阳光洒进房间&#xff0c;咖啡机开始工作&#xff0c;音响播放你喜欢的音乐。这不是科幻电影&#xff0c;而是用Xinference-v1.17.1构建的智能家居控制系…...

Qwen2.5-7B-Instruct效果展示:农业病虫害图像描述→防治方案生成

Qwen2.5-7B-Instruct效果展示&#xff1a;农业病虫害图像描述→防治方案生成 想象一下&#xff0c;一位农民在田间地头&#xff0c;用手机拍下一片叶子上的异常斑点。几分钟后&#xff0c;他不仅得到了这是什么病害的准确诊断&#xff0c;还收到了一份详细的、可操作的防治方案…...

GME-Qwen2-VL-2B效果实测:抽象文字如何匹配具体图片?

GME-Qwen2-VL-2B效果实测&#xff1a;抽象文字如何匹配具体图片&#xff1f; 1. 多模态搜索的突破性体验 想象一下&#xff0c;你脑海中浮现出一句富有哲理的句子&#xff1a;"人生不是裁决书"&#xff0c;却想找一张能表达这种意境的图片。传统搜索引擎会怎么做&a…...

Java笔记——JMM

在多线程编程中&#xff0c;共享变量的可见性、操作的原子性以及指令的重排序&#xff0c;常常成为导致程序出现诡异Bug的罪魁祸首。而Java之所以能够成为并发编程的首选语言之一&#xff0c;很大程度上归功于其强大的Java内存模型&#xff08;Java Memory Model, JMM&#xff…...

达摩院PALM春联模型多场景落地:政务大厅自助春联机解决方案

达摩院PALM春联模型多场景落地&#xff1a;政务大厅自助春联机解决方案 春节贴春联&#xff0c;是咱们中国人传承千年的文化习俗。一副好春联&#xff0c;不仅承载着对新年的美好祝愿&#xff0c;也体现着家庭的品味和格调。但你知道吗&#xff1f;现在写春联这件事&#xff0…...

Super Qwen Voice World效果惊艳:‘金币数量’HUD实时反映生成计数

Super Qwen Voice World效果惊艳&#xff1a;‘金币数量’HUD实时反映生成计数 "Its-a me, Qwen!" 欢迎来到基于 Qwen3-TTS 构建的复古像素风语气设计中心。在这里&#xff0c;配音不再是枯燥的参数调节&#xff0c;而是一场 8-bit 的声音冒险&#xff01; 1. 视觉盛…...

DataGuard运维避坑指南:当备库遇到ORA-01578坏块时的完整恢复流程

DataGuard运维实战&#xff1a;备库ORA-01578坏块诊断与FROM SERVICE精准修复 凌晨三点&#xff0c;当告警短信突然亮起"ORA-01578: ORACLE data block corrupted"的红色提示时&#xff0c;作为DBA的你很清楚这意味着什么——这不仅是简单的坏块问题&#xff0c;更是…...

CAN总线技术:数字信号与汽车电子应用解析

CAN总线技术解析&#xff1a;从数字信号本质到汽车电子应用1. CAN总线概述1.1 基本定义与技术背景CAN&#xff08;Controller Area Network&#xff09;总线是一种专为工业控制和汽车电子设计的串行通信协议&#xff0c;由德国Bosch公司于1983年开发&#xff0c;后成为国际标准…...

力扣高频经典双题解:接雨水 + 无重复最长子串(思路 + 满分代码)

接雨水、无重复字符最长子串是面试高频、算法入门必刷的经典题&#xff0c;一道考动态规划预处理&#xff0c;一道考滑动窗口&#xff0c;都是数组 / 字符串题型里的核心套路。本篇把两道题的思路讲透、代码写清&#xff0c;新手也能一遍看懂&#xff0c;刷题效率直接拉满&…...