【C++】二叉搜索树KV模型

news2024/11/28 0:54:24

最典型的一个场景,自动翻译软件,输入中文,输出对应的英文,输入英文,输出对应的中文。

可以用一颗搜索二叉树来实现这一功能。

K->key V->val

基础结构和普通搜索二叉树保持一致,只是成员多了一个_val,模板也多了一个参数V。

还不知道二叉搜索树的可以看我另外一篇博客。

namespace kv
{
	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)
		{
			//...

			return true;
		}

		void InOrder()
		{
			_InOrder(_root);
			cout << endl;
		}
	private:

		void _InOrder(Node* root)
		{
			if (root == nullptr)
			{
				return;
			}

			_InOrder(root->_left);
			cout << root->_key << ":" << root->_value << endl;
			_InOrder(root->_right);
		}
	private:
		Node* _root = nullptr;
	};

测试一下功能:

如果要实现一个统计单词个数的呢?

那么就构造一个<string,int>类型的就好了,string记录单词,int记录个数。

	void TestBSTree2()
	{
		string arr[] = { "香蕉", "苹果", "香蕉", "草莓", "香蕉", "苹果", "苹果", "苹果" };

		BSTree<string, int> countTree;
		for (auto& str : arr)
		{
			//BSTreeNode<string, int>* ret = countTree.Find(str);
			auto ret = countTree.Find(str);
			if (ret)
			{
				ret->_value++;
			}
			else
			{
				countTree.Insert(str, 1);
			}
		}

		countTree.InOrder();
	}

总和代码:

#include<iostream>
using namespace std;

namespace kv
{
	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)
		{
			//...

			return true;
		}

		void InOrder()
		{
			_InOrder(_root);
			cout << endl;
		}
	private:

		void _InOrder(Node* root)
		{
			if (root == nullptr)
			{
				return;
			}

			_InOrder(root->_left);
			cout << root->_key << ":" << root->_value << endl;
			_InOrder(root->_right);
		}
	private:
		Node* _root = nullptr;
	};

	void TestBSTree1()
	{
		BSTree<string, string> dict;
		dict.Insert("sort", "排序");
		dict.Insert("left", "左边");
		dict.Insert("right", "右边");
		dict.Insert("string", "字符串");
		dict.Insert("insert", "插入");
		string str;
		while (cin >> str)
		{
			BSTreeNode<string, string>* ret = dict.Find(str);
			if (ret)
			{
				cout << "对应的中文:" << ret->_value << endl;
			}
			else
			{
				cout << "对应的中文->无此单词" << endl;
			}
		}
	}

	void TestBSTree2()
	{
		string arr[] = { "香蕉", "苹果", "香蕉", "草莓", "香蕉", "苹果", "苹果", "苹果" };

		BSTree<string, int> countTree;
		for (auto& str : arr)
		{
			//BSTreeNode<string, int>* ret = countTree.Find(str);
			auto ret = countTree.Find(str);
			if (ret)
			{
				ret->_value++;
			}
			else
			{
				countTree.Insert(str, 1);
			}
		}

		countTree.InOrder();
	}
}

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

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

相关文章

关于Tab制表符,点击一次跳很多字符的问题解决

首先在出现问题的地方右键鼠标&#xff0c;出现后点击段落。 进入后点击左下角的制表位 进入后点击全部清除&#xff0c;然后确认&#xff0c;问题就解决了&#xff08;哪里有问题就处理哪里&#xff09;

天纵竞赛系统助力江苏省“苏小登杯”不动产登记技能竞赛暨首届全国赛省级选拔赛

7月14日&#xff0c;第四届江苏省“苏小登杯”不动产登记技能竞赛暨首届全国赛省级选拔赛在苏州广播电视总成功举办。天纵竞赛系统提供核心软件技术及其配套硬件支持。 本次竞赛由江苏全省13支队伍、52名一线不动产登记人员参加比赛&#xff0c;竞赛环节包括笔试、现场竞答、代…

性能测试 —— JMeter分布式测试及其详细步骤

性能测试概要 性能测试是软件测试中的一种&#xff0c;它可以衡量系统的稳定性、扩展性、可靠性、速度和资源使用。它可以发现性能瓶颈&#xff0c;确保能满足业务需求。很多系统都需要做性能测试&#xff0c;如Web应用、数据库和操作系统等。 性能测试种类非常多&#xff0c…

windows操作小技巧1:文件批操作更改类型

今日更新一个Windows操作小技巧: 日常生活中我们有批量操作更改文件后缀名&#xff08;类型&#xff09;的需要&#xff1a; 比如这有五个.txt文本文件&#xff0c;我要想将其批量改为.html该如何操作呢&#xff1f; 首先新建文本文档&#xff1a; 其次在新建的文本文档输入以…

B 端软件:常见知识梳理

前言 我一直从事企业级软件研发工作&#xff0c;也就是我们通常称之为 B 端软件。近年来&#xff0c;我的工作重心主要在研发低代码平台和 aPaaS 平台&#xff0c;这使我对 B 端软件有了更深入的理解。 和 B 端软件对应的就是我们熟悉的 C 端软件&#xff0c;我们手机中安装的那…

VsCode添加Vue模版代码片段

文章目录 VsCode添加Vue模版代码片段1. 复制一段已有要制作模板的Vue代码&#xff0c;比如&#xff1a;2. 粘贴到下方链接的工具网站&#xff0c;可自动生成模板代码的片段3. VsCode中设置代码片段3-1 打开菜单&#xff1a;首选项-用户片段3-2 出现如下的搜索栏&#xff0c;搜索…

简易注册中心监控NAS断电断网

日常使用NAS过程中&#xff0c;偶尔会出现家里断电或者断网的情况&#xff0c;NAS自带网络断开的通知功能&#xff0c;但需要是恢复网络链接后才会通知&#xff0c;而此时都恢复了&#xff0c;再通知也就没那么重要&#xff0c;还有断电情况下也是需要回家才能知道&#xff0c;…

opencv -12 图像运算之按 《位或》 运算(图像融合图像修复和去除)

位或运算 或运算的规则是&#xff0c;当参与或运算的两个逻辑值中有一个为真时&#xff0c;结果就为真。其逻辑关系可以类比为如图 所示的并联电路&#xff0c;两个开关中只要有任意一个闭合时&#xff0c;灯就会亮。 3-5 对参与或运算的算子的不同情况进行了说明&#xff0c;…

浅谈设计模式之工厂模式

0 工厂模式的介绍 工厂模式属于创建型模式&#xff0c;是Java中最常见的设计模式之一。工厂模式提供了一种将对象的实例化过程封装在工厂类的方式&#xff0c;通过工厂模式可以屏蔽掉对象的创建过程&#xff0c;对外提供了一种统一的接口来创建不同类型的对象。 优点&#xf…

数据结构01-线性结构-链表栈队列-队列篇

文章目录 参考&#xff1a;总结大纲要求线性结构-队列QQ号码解密 参考&#xff1a; 总结 本系列为C数据结构系列&#xff0c;会介绍 线性结构&#xff0c;简单树&#xff0c;特殊树&#xff0c;简单图等。本文为线性结构部分。 大纲要求 线性结构 【 3 】链表&#xff1a;单…

在线版PS就选这5个!能免费使用

虽然AdobePhotoshop作为专业的图形编辑工具为设计师带来了很多便利&#xff0c;但是它下载繁琐&#xff0c;费用昂贵的特性也让很多设计师望而却步。本文精心整理了5款能作为在线PS使用的设计工具&#xff0c;不仅能减轻操作设备的内存负担&#xff0c;而且可以免费使用&#x…

Java阶段五Day07

Java阶段五Day07 文章目录 Java阶段五Day07问题解析dubbo和nacos Dubbo负载均衡负载均衡介绍准备一个负载均衡的环境Dubbo负载均衡策略配置负载均衡的方式dubbo配置负载均衡优先级微服务阶段性架构 Spring Boot Starter自定义配置准备一个starter案例项目Spring框架版本迭代案例…

K8S安全风险及防护建议

Kubernetes&#xff08;K8S&#xff09;是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;方便进行声明式配置和自动化。一个Kubernetes集群通常包含跨多台计算机运行的控制平面和多个工作节点&#xff08;node&#xff09;&#xff0c;控…

415. 字符串相加

给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 示例 1&#xff1a; 输入&#xff…

被问懵了,加密后的数据如何进行模糊查询?

我们知道加密后的数据对模糊查询不是很友好&#xff0c;本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路&#xff0c;希望对大家有所启发。 为了数据安全我们在开发过程中经常会对重要的数据进行加密存储&#xff0c;常见的有&#xff1a;密码、手机号、电话号码、…

【中危】Apache Accumulo 身份认证过程缺陷

漏洞描述 Apache Accumulo是一个排序分布式的 Key-Value 存储应用。 在Apache Accumulo 2.1.0版本中&#xff0c;AccumuloClient 在构造新的实例时移除了自动身份验证机制&#xff0c;身份验证始终在 shell 中进行。当 shell 闲置时间过长&#xff0c;需要重新进行身份验证时&…

前端调整滚动条的外观样式

前端调整滚动条的外观样式 css主要分三个步骤 1、设置滚动条宽度 ::-webkit-scrollbar { width: 5px; } 效果&#xff1a;分别设置50px和5px宽度 2、设置里面小滑块的样式 ::-webkit-scrollbar-thumb {border-radius: 5px;-webkit-box-shadow: inset 0 0 5px rgba(0,0,0…

编程导航算法通关村第 1关 | 两个链表的第一个公共节点

编程导航算法通关村第 1关 | 白银挑战 剑指 Offer 52. 两个链表的第一个公共节点 集合/map 将headA中的链表&#xff0c;放在一个set集合中&#xff0c; 依次遍历headB&#xff0c; headB中第一个包含在set集合中的节点就是第一个公共子节点 ListNode getIntersectionNode(L…

网络安全专业必考的三个证书,初学者建议收藏!

学习网络安全&#xff0c;有三个必考证书&#xff0c;最后一个人手一本&#xff01; 一&#xff0c;NISP证书 NISP即国家信息安全水平考试&#xff0c;由中国信息安全测评中心发证&#xff0c;属于网络安全专业的必考证书。 只有考取NISP一级证书才有机会考取二级&#xff0…

【动手学深度学习】--10.卷积神经网络

文章目录 卷积神经网络1.从全连接层到卷积1.1全连接层1.2平移不变性1.3局部性1.4卷积 2.卷积层2.1互相关计算2.2卷积层2.3图像中目标的边缘检测2.4学习卷积核 3.填充和步幅3.1填充3.2步幅 4.多输入多输出通道4.1多输入通道4.2多输出通道4.3 11卷积层 5.池化层5.1池化层5.2填充和…