c++实现简单搜索二叉树<K,V>形

文章目录

  • 搜索二叉树
    • 节点类
      • BSTreeNode(节点类的构造)
    • BSTree(功能实现类)
      • Insert(插入)
      • Erase(删除)
      • Find(查找这个节点)

搜索二叉树

搜索二叉树本质:左节点比我小 右节点比我大
在这里插入图片描述

节点类

BSTreeNode:给自身节点封装一个类 用这个类来添加节点的操作
我们写的是一个key.value型的搜索二叉树

template<class K,class V>
struct BSTreeNode
{typedef BSTreeNode<K,V> Node;Node* _left;//左孩子Node* _right;//右孩子K _key;//建V _value;//值
};

BSTreeNode(节点类的构造)

BSTreeNode(const K& key, const V& value): _left(nullptr), _right(nullptr), _key(key), _value(value){}

BSTree(功能实现类)

因为我们实现的是key,value型的所以模版是K,V
类中变量

template<class K,class V>
class BSTree
{typedef BSTreeNode<K,V> Node;
private:Node* _root;
};

Insert(插入)

首先:要判断是否为空树 如果是空树直接new一个新节点当根节点
还有就是建立一个cur让其等于根节点
用一个parent记录cur的父节点
用他们中的key值比较谁大谁小
小的往左走,大的往右走
走到合适位置,new一个新节点插入到树中

bool Insert(const K& key,const V& value)
{if (_root == nullptr)//树为空的情况{_root = new Node(key,value);return true;}Node* parent = nullptr;//因为cur是局部变量函数走完会销毁,所以增加一个指针 链接curNode* cur = _root;while (cur){if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}else{return false;}}cur = new Node(key,value);if (parent->_key < key)//大就链右边 小链左边{parent->_right = cur;}else{parent->_left = cur;}return true;
}

Erase(删除)

看代码中的注释

bool Erase(const K& key)
{Node* parent = nullptr;//记录父节点Node* cur = _root;//从根开始找while (cur){//大了往右 小了往左if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}else//找到节点{if (cur->_left == nullptr)//左树为空{if (cur == _root)//头节点没有左子树{_root = cur->_right;}else//不为根节点{if (cur == parent->_right)//自身为父节点的右节点{//让自己的右节点成为父节点的右节点parent->_right = cur->_right;}else//左节点{//让我的右节点成为父节点的左节点parent->_left = cur->_right;}}delete cur;//删掉自己这个节点return true;}else if (cur->_right == nullptr)//右树为空{if (cur == _root)//头节点没有右子树{_root = cur->_left;}else{//让自己的左节点代替自己if (cur == parent->_right){parent->_right = cur->_left;}else{parent->_left = cur->_left;}}delete cur;//删除节点return true;}else{//左右都不为空//找到右数中最小的代替自己Node* rightMin = cur->_right;//不能为空 如果为空的话 //要删的是头节点 会让空的_left指向他 会崩溃Node* father = cur;//定义这个为rightMin的父节点while (rightMin->_left)//找右树中的最小{father = rightMin;rightMin = rightMin->_left;}cur->_key = rightMin->_key;//交换值//如果 相等 那么才让他的父节点左指向他自身节点的右if (rightMin == father->_left){father->_left = rightMin->_right;}else//不想等就是说明的头节点 那么就要让头节点的右指向他的右{father->_right = rightMin->_right;}delete rightMin;return true;}}}return false;
}

Find(查找这个节点)

大了往右 小了往左 找到返回节点 没找到返回空

Node* Find(const K& key)
{Node* cur = _root;while (cur){if (cur->_key < key){cur = cur->_right;}else if (cur->_key > key){cur = cur->_left;}else{return cur;}}return nullptr;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/545110.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二十四天-数据可视化Matplotlib

目录 1.介绍 2.使用 1. 安装&#xff1a; 2.创建简单图表 3.图表类型 1.一共分为7类 2.变化 1.折线图 3.分布 ​编辑 1.直方图 2.箱型图 4.关联 1. 散点图&#xff1a; 2.热力图&#xff1a; 5.组成 1.饼图 2.条形图 6.分组 1.簇型散点图 2.分组条形图 3.分…

程序人生——Java多线程和并发的使用建议

目录 引出多线程和并发建议118&#xff1a;不推荐覆写start方法建议119&#xff1a;启动线程前stop方法是不可靠的建议120&#xff1a;不适用stop方法停止线程 建议121&#xff1a;线程优先级只使用三个等级建议122&#xff1a;使用线程异常处理器提升系统可靠性建议123&#x…

主干网络篇 | YOLOv8更换主干网络之ShuffleNetV2

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。ShuffleNetV2是一种轻量级的神经网络架构&#xff0c;用于图像分类和目标检测任务。它是ShuffleNet的改进版本&#xff0c;旨在提高模型的性能和效率。ShuffleNetV2相比于之前的版本&#xff0c;在保持模型轻量化的同时&am…

什么是CRM系统?全面解析,学会利用CRM提升业务效率

在客户心目中&#xff0c;200家CRM企业可能会有200种CRM管理系统&#xff0c;很多客户接触客户经理的第一句话都是&#xff1a;“你家是什么CRM&#xff1f;”。CRM系统是什么&#xff1f;很多技术商、企业管理者自己往往都没有概念&#xff0c;我们通过一文全面解析。简单来说…

我打算修一段时间仙,望周知

1、大科学家牛顿也修过仙&#xff0c;虽然修的是西方的仙&#xff1b;我们东方人不信那个邪&#xff0c;有自己优秀的传统文化&#xff0c;我只修东方的仙&#xff1b;另外&#xff0c;作为普通凡人我成就和智慧都无法望牛顿老人家项背的普通人&#xff0c;即使现在暂时“修仙”…

记录对NSIS的一些微调 实现Electron安装包美化

利洽科技-nsNiuniuSkinUI - NSIS 实现了electron 的安装包美化&#xff0c;免费&#xff0c;便捷。 下面我整理了一些关于它的微调&#xff0c;使其安装卸载更加简单快捷。 1. 默认展示安装路径部分 &#xff08;1&#xff09;将moreconfiginfo标签visible 设置为 true&#…

SpringCloud-深度理解ElasticSearch

一、Elasticsearch概述 1、Elasticsearch介绍 Elasticsearch&#xff08;简称ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;构建在Apache Lucene基础上。它提供了一个强大而灵活的工具&#xff0c;用于全文搜索、结构化搜索、分析以及数据可视化。ES最初设计用…

探索设计模式的魅力:探索发布-订阅模式的深度奥秘-实现高效、解耦的系统通信

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;并坚持默默的做事。 探索发布-订阅模式的深度奥秘&#xff1a;实现高效、解耦的系统通信 文章目录 一、案例场景&am…

Parade Series - Web Streamer Low Latency

Parade Series - FFMPEG (Stable X64) 延时测试秒表计时器 ini/config.ini [system] homeserver storestore\nvr.db versionV20240312001 verbosefalse [monitor] listrtsp00,rtsp01,rtsp02 timeout30000 [rtsp00] typelocal deviceSurface Camera Front schemartsp ip127…

数据可视化-ECharts Html项目实战(1)

在之前的文章中&#xff0c;我们学习了如何安装Visual Studio Code并下载插件&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 安装 Visual Studio…

C++中的friend关键字

C中的friend关键字允许其他类或函数访问私有和受保护成员。使用friend是一种破坏封装的做法&#xff0c;但在某些情况下&#xff0c;它提供了必要的灵活性。 friend函数 定义&#xff1a;允许一个普通函数访问类的私有&#xff08;private&#xff09;和受保护&#xff08;prot…

关于选中,取消选中,和选中同分类下的其他

常见于商城购买页如图所示&#xff1a; 完整代码如下&#xff1a; css部分&#xff1a; :class"[seleIndex[index] index_one ? new_style : ]" .new_style{background-color: #e9445a !important;color: #FFFFFF; }js部分 const selectdata reactive({select:[…