C++搜索二叉树的实现

搜索二叉树的实现

  • key
  • key-value
  • 测试用例

key

namespace key{
template<class k>
struct BSTreeNode
{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;
private:Node* _root = nullptr;
public:BSTree() = default;BSTree(const BSTree<k>& t) {_root = Copy(t._root);}BSTree<k>& operator=(BSTree<k>& t) {swap(_root, t._root);return *this;}~BSTree() {Destroy(_root);}bool FindR(const k& key) {return _FindR(_root, key);}bool InsertR(const k& key) {return _InsertR(_root, key);}bool EraseR(const k& key) {return _EraseR(_root, key);}bool Insert(const k& key) {if (_root == nullptr) {_root = new BSTreeNode<k>(key);return true;}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 {return false;}}cur = new BSTreeNode<k>(key);if (cur->_key > parent->_key) {parent->_right = cur;}else if (cur->_key < parent->_key) {parent->_left = cur;}return true;}bool 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 true;}}return false;}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{//1.左为空if (cur->_left == nullptr) {if (cur == _root) {_root = cur->_right;}else if (parent->_left == cur) {parent->_left = cur->_right;}else {parent->_right = cur->_right;}delete cur;}//2.右为空else if (cur->_right == nullptr){if (cur == _root) {_root = cur->_left;}else if (parent->_left == cur) {parent->_left = cur->_left;}else {parent->_right = cur->_left;}delete cur;}//3.左右都不为空else{//找右树最小节点替代,也可以是左树最大节点替代(这里找的右树的最小结点)Node* pminright = cur; //preminrightNode* minright = cur->_right;while (minright->_left) {pminright = minright;minright = minright->_left;}cur->_key = minright->_key;if (pminright->_left == minright) {//minright的最小节点没有左子树且为pminright的左孩子pminright->_left = minright->_right;}else{//minright的最小节点没有左子树且为pminright的右孩子pminright->_right = minright->_right;}delete minright;}return true;}}return false;}void InOrder() {_InOrder(_root);cout << endl;}void _InOrder(Node* root) {if (root == nullptr) {return;}_InOrder(root->_left);cout << root->_key << "  ";_InOrder(root->_right);}protected:Node* Copy(Node* _root) {if (_root == nullptr)return nullptr;Node* newRoot = new Node(_root->_key);newRoot->_left = Copy(_root->_left);newRoot->_right = Copy(_root->_right);return newRoot;}void Destroy(Node* root) {if (root == nullptr) {return;}Destroy(root->_left);Destroy(root->_right);delete root;root = nullptr;}bool _FindR(Node* root,const k& key) {if (root == nullptr)return false;if (root->_key == key) {return true;}if (root->_key > key) {return _FindR(root->_left, key);}else{return _FindR(root->_right, key);}}bool _InsertR(Node*& root, const k& key) {if (root == nullptr) {root = new Node(key);return true;}if (root->_key < key){return _InsertR(root->_right, key);}else if (root->_key > key){return _InsertR(root->_left, key);}else{return false;}}bool _EraseR(Node*& root, const k& key) {if (root == nullptr)return false;if (root->_key < key){return _EraseR(root->_right, key);}else if (root->_key > key){return _EraseR(root->_left, key);}else{Node* del = root;// 开始准备删除if (root->_right == nullptr){root = root->_left;}else if (root->_left == nullptr){root = root->_right;}else{Node* maxleft = root->_left;while (maxleft->_right){maxleft = maxleft->_right;}swap(root->_key, maxleft->_key);return _EraseR(root->_left, key);}delete del;return true;}}};
};

key-value

namespace key_value
{template<class K, class V>struct BSTreeNode{BSTreeNode<K, V>* _left;BSTreeNode<K, V>* _right;K _key;V _value;BSTreeNode(const K& key, const V& value):_left(nullptr), _right(nullptr), _key(key), _value(value){}};template<class K, class V>class BSTree{typedef BSTreeNode<K, V> Node;public:bool Insert(const K& key, const V& value){if (_root == nullptr){_root = new Node(key, value);return true;}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{return false;}}cur = new Node(key, value);// 链接if (parent->_key < key){parent->_right = cur;}else{parent->_left = cur;}return true;}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;}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{// 删除// 1、左为空if (cur->_left == nullptr){if (cur == _root){_root = cur->_right;}else{if (parent->_left == cur){parent->_left = cur->_right;}else{parent->_right = cur->_right;}}delete cur;} // 2、右为空else if (cur->_right == nullptr){if (cur == _root){_root = cur->_left;}else{if (parent->_left == cur){parent->_left = cur->_left;}else{parent->_right = cur->_left;}}delete cur;}else{// 找右树最小节点替代,也可以是左树最大节点替代Node* pminRight = cur;Node* minRight = cur->_right;while (minRight->_left){pminRight = minRight;minRight = minRight->_left;}cur->_key = minRight->_key;if (pminRight->_left == minRight){pminRight->_left = minRight->_right;}else{pminRight->_right = minRight->_right;}delete minRight;}return true;}}return false;}void InOrder(){_InOrder(_root);cout << endl;}protected:void _InOrder(Node* root){if (root == nullptr)return;_InOrder(root->_left);cout << root->_key << ":" << root->_value << endl;_InOrder(root->_right);}private:Node* _root = nullptr;};
}

测试用例

#include<iostream>
#include"BSTree.h"using namespace std;
void TestBSTree()
{int a[] = { 8, 3, 1, 10, 6, 4, 7, 14, 13 };key::BSTree<int> t1;for (auto e : a){t1.Insert(e);}t1.InOrder();t1.Erase(4);t1.InOrder();t1.Erase(14);t1.InOrder();t1.Erase(3);t1.InOrder();t1.Erase(8);t1.InOrder();for (auto e : a){cout << "delete:" << e << "    ";t1.Erase(e);t1.InOrder();}t1.InOrder();
}void TestBSTree2()
{int a[] = { 8, 3, 1, 10, 6, 4, 7, 14, 13 };key::BSTree<int> t1;for (auto e : a){t1.InsertR(e);}t1.InOrder();t1.EraseR(10);t1.EraseR(14);t1.EraseR(13);t1.InOrder();for (auto e : a){t1.EraseR(e);t1.InOrder();}t1.InOrder();
}void TestBSTree3()
{int a[] = { 8, 3, 1, 10, 6, 4, 7, 14, 13 };key::BSTree<int> t1;for (auto e : a){t1.InsertR(e);}t1.InOrder();key::BSTree<int> t2(t1);t2.InOrder();
}void TestBSTree4()
{key_value::BSTree<string, string> dict;dict.Insert("sort", "排序");dict.Insert("left", "左边");dict.Insert("right", "右边");dict.Insert("string", "字符串");dict.Insert("insert", "插入");dict.Insert("erase", "删除");string str;while (cin >> str){auto ret = dict.Find(str);if (ret){cout << ":" << ret->_value << endl;}else{cout << "无此单词" << endl;}}
}void TestBSTree5()
{string arr[] = { "西瓜", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉", "梨" };key_value::BSTree<string, int> countTree;for (auto str : arr){//key_value::BSTreeNode<string, int>* ret = countTree.Find(str);auto ret = countTree.Find(str);if (ret == nullptr){countTree.Insert(str, 1);}else{ret->_value++;}}countTree.InOrder();
}int main()
{TestBSTree();cout << "1" << endl;TestBSTree2();cout << "2" << endl;TestBSTree3();cout << "3" << endl;//TestBSTree4();cout << "4" << endl;TestBSTree5();cout << "5" << endl;return 0;
}

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

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

相关文章

学习经验心得体会

学习经验心得体会 自从踏入学习的殿堂&#xff0c;我深知知识如同海洋&#xff0c;无边无际。多年的学习经历&#xff0c;使我积累了丰富的经验&#xff0c;也对学习有了更深入的理解。在此&#xff0c;我愿将我的学习经验心得体会分享给大家&#xff0c;希望能对正在探索知识…

01-Linux系统概述,安装网络和防火墙配置

Linux系统概述&#xff0c;安装网络和防火墙配置 unix概述 Unix 是在1969年美国贝尔实验室的 肯.汤普森开发出来的一款操作系统&#xff0c;什么是操作系统&#xff1f;大家正在玩的 Windows 和 Max OS就是两个操作系统。操作系统是用户和计算机的接口&#xff0c;同时也是计…

Win11桌面出现的这个图标“了解此图片”怎么关闭?

&#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609; 在csdn获奖荣誉: &#x1f3c6;csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ …

第3章---初始化AttributeSet文件

文件结构&#xff1a; 更改文件将高亮显示 Source Private AbilitySystemComponen RPGAbilitySystemComponent.cppRPGAttributeSet.cpp Character PGGameCharacterBase.cppRPGGameEnemy.cppRPGGamePlayerCharacter.cpp Game RPGGameModeBase.cpp Interaction EnemyInterface…

c++的STL(1) -- STL概述

STL(Standard Template Library), 意思为标准模版库。 STL主要分为三个部分: 容器&#xff0c; 算法&#xff0c; 迭代器。 algorithm&#xff08;算法&#xff09; - 对数据进行处理&#xff08;解决问题) 步骤的有限集合container&#xff08;容器&#xff09; - 用…

Java开发手册,java高并发高可用面试题

前言 今年我也33了&#xff0c;离传说中不好找工作的35岁又更近了。说没有焦虑是对自己撒谎&#xff0c;于是我采访了一些人&#xff0c;自己思考了下&#xff0c;写下了这篇文章&#xff0c;希望能有些共鸣。 先看看大家的态度&#xff1a; 色老力衰&#xff0c;不好忽悠&a…

Spring全家桶面试题-学习自测

Spring相关面试题&#xff1f; Bean的实例化和Bean的初始化有什么区别&#xff1f;什么是AOP、能做什么&#xff1f;有哪些常见的概念名称&#xff1f;它和AsepctJ有什么区别&#xff1f;Spring中的事务是如何实现的&#xff1f;Spring的传播机制有哪些&#xff0c;底层是如何…

rt-thread uart驱动

uart驱动描述基于GD32F470芯片。 rt-thread提供了一套I/O设备模型&#xff0c;如果想要使用操作系统的驱动去进行操作&#xff0c;就得将具体芯片的硬件驱动注册到设备驱动框架上。 关于rt-thread的I/O设备模型相关内容可以参考 rt-thread I/O设备模型-CSDN博客文章浏览阅读55…

vue命令行

书接上回&#xff0c;一直没能将vue-shop-master项目启动&#xff0c;还是停留在命令行&#xff0c;现参考链接如下&#xff0c; https://blog.csdn.net/jieyucx/article/details/127915699 止步不前了&#xff0c;晚上再摸索吧&#xff0c;搞电商去。。。。溜了溜了&#x…

MySQL进阶之(四)InnoDB数据存储结构之行格式

四、InnoDB数据存储结构之行格式 4.1 行格式的语法4.2 COMPACT 行格式4.2.1 记录的额外信息01、变长字段长度列表02、NULL 值列表03、记录头信息 4.2.2 记录的真实数据 4.3 Dynamic 和 Compressed 行格式4.3.1 字段的长度限制4.3.2 行溢出4.3.3 Dynamic 和 Compressed 行格式 4…

nodejs google search console api对接之提交网址到索引

推荐一款AI网站&#xff0c; AI写作与AI绘画智能创作平台 - 海鲸AI | 智能AI助手&#xff0c;支持GPT4设计稿转代码 要使用 Node.js 通过 Google Search Console API 添加网址&#xff08;即提交网址到索引&#xff09;&#xff0c;你需要遵循以下步骤&#xff1a; 设置Google…

【Flutter 】get-cli init报错处理

报错内容 get init 命令跳出,报错内如下 Select which type of project you want to creat Synchronous waiting using dart:cli waitFor Unhandled exceotion . Dart WaitforEvent is deprecated and disabled by default. This feature will be fully removed in Dart 3.4 …

【定岗定编】某度假村酒店客房部定岗定编管理咨询项目纪实

该度假村酒店由于地域广阔&#xff0c;将客服部分为了四个不同区域&#xff0c;这样就导致了在不同的区域员工的接待量不均衡的状况&#xff0c;引起了员工的强烈不满。如何合理地配置客户部人员以及如何合理地鉴定员工的工作量成为该酒店所面临的两大难题。让我们来看看在人力…

C语言——assert函数

目录 深入了解C语言中的assert函数 assert函数的基本用法 assert函数的工作原理 示例代码 总结 深入了解C语言中的assert函数 在C语言中&#xff0c;assert函数是一个非常有用的调试工具&#xff0c;用于在程序中插入断言&#xff0c;以便在运行时检查特定条件是否满足。如…

vulhub中ThinkPHP5 SQL注入漏洞 敏感信息泄露

漏洞原理 传入的某参数在绑定编译指令的时候又没有安全处理&#xff0c;预编译的时候导致SQL异常报错。然而thinkphp5默认开启debug模式&#xff0c;在漏洞环境下构造错误的SQL语法会泄漏数据库账户和密码 启动后&#xff0c;访问http://your-ip/index.php?ids[]1&ids[]2…

即插即用篇 | YOLOv8 引入 NAM 注意力机制 | 《NAM: Normalization-based Attention Module》

论文名称:《NAM: Normalization-based Attention Module》 论文地址:https://arxiv.org/pdf/2111.12419.pdf 代码地址:https://github.com/Christian-lyc/NAM 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large…

[蓝桥杯 2015 省 B] 移动距离

题目链接 [蓝桥杯 2015 省 B] 移动距离 题目描述 X X X 星球居民小区的楼房全是一样的&#xff0c;并且按矩阵样式排列。其楼房的编号为 1 , 2 , 3 , . . . 1,2,3,... 1,2,3,...。 当排满一行时&#xff0c;从下一行相邻的楼往反方向排号。 比如&#xff1a;当小区排号宽度为…

C++之类型转换

C语言中的类型转换 在C语言中, 如果赋值运算符左右两侧类型不同, 或者形参与实参类型不匹配, 或者返回值类型与 接收返回值类型不一致时, 就需要发生类型转化, C语言中总共有两种形式的类型转换: 隐式类型转换和显式类型转换 1. 隐式类型转化是关联度很强, 意义相近的类型之间…

【CSP试题回顾】201512-2-消除类游戏

CSP-201512-2-消除类游戏 解题思路 输入棋盘大小和颜色: 首先&#xff0c;程序从标准输入读取两个整数n和m&#xff0c;分别代表棋盘的行数和列数。然后&#xff0c;程序读取接下来的n行输入&#xff0c;每行包含m个整数&#xff0c;代表棋盘上每个方格中的棋子颜色。 初始化…

[蓝桥杯 2017 省 A] 油漆面积 Java代码及一些个人理解

[蓝桥杯 2017 省 A] 油漆面积 题目描述 X 星球的一批考古机器人正在一片废墟上考古。 该区域的地面坚硬如石、平整如镜。 管理人员为方便&#xff0c;建立了标准的直角坐标系。 每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。 经过各种测量&#xff0c;每个…