key形式和key/value形式二叉树

news2024/12/24 21:46:18

    首先模拟一下key形式类 使用的结构是搜索二叉树  结点中有左孩子和右孩子  还有一个存储的值

	template <class K>
	struct BSTnode//搜索二叉树不支持修改  中序遍历是有序的
	{

		K _key;
		BSTnode<K>* _left;
		BSTnode<K>* _right;

		BSTnode(const K& key)
			:_key(key)
			, _left(nullptr)
			, _right(nullptr)
		{}
	};

这里二叉树代码在之前有更详细的 也有测试代码 就不去复制了  

主要功能有四个  删除 插入 遍历  查找  

     模拟一下key/value形式类  使用的结构是搜索二叉树   每一个节点中有左孩子和右孩子 还有一个key 和一个value  当我们找到可以key之后 也就找到了对应的value

template <class K, class V>
struct BSTnode//搜索二叉树不支持修改  中序遍历是有序的
{

	K _key;
	V _value;
	BSTnode<K, V>* _left;
	BSTnode<K, V>* _right;

	BSTnode(const K& key, const V& value)

		:_key(key)
		, _value(value)
		, _left(nullptr)
		, _right(nullptr)
	{}
};

之后二叉树的功能有插入 删除  查找 遍历   这其中只有insert 需要修改  既要插入value 也要插入key  但对于删除 查找 遍历 只要有key就可以完成 所以就不需要改变

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;
}

这里通过一段string类型的进行测试

int main()
{
	keyvalue::BSTree <string, string> tt;
	tt.insert("left","左边");
	tt.insert("right", "右边");
	tt.insert("insert", "插入");
	tt.insert("string", "字符串");

	string str;
	while (cin >> str)
	{
		auto ret = tt.find(str);
		if (ret)
		{
			cout << "->" << ret->_value << endl;
		}
		else
		{
			cout << "无此单词 请重新输入" << endl;
		}
	}
	//tt.insert();

	return 0;
}

通过查找key 就可以确定对应的存储value内容  非常方便   这里最后使用的是ctrl+z来结束程序执行

  这里使用到了 operator>>(string)这个函数的返回值istream 会被operator bool 转换成bool值来进行判断是否结束程序  而当我们输入ctrl+z  就会转换成bool值false 这样就会结束程序

    首先模拟一下key形式类 使用的结构是搜索二叉树  结点中有左孩子和右孩子  还有一个存储的值

	template <class K>
	struct BSTnode//搜索二叉树不支持修改  中序遍历是有序的
	{

		K _key;
		BSTnode<K>* _left;
		BSTnode<K>* _right;

		BSTnode(const K& key)
			:_key(key)
			, _left(nullptr)
			, _right(nullptr)
		{}
	};

这里二叉树代码在之前有更详细的 也有测试代码 就不去复制了  

主要功能有四个  删除 插入 遍历  查找  

     模拟一下key/value形式类  使用的结构是搜索二叉树   每一个节点中有左孩子和右孩子 还有一个key 和一个value  当我们找到可以key之后 也就找到了对应的value

template <class K, class V>
struct BSTnode//搜索二叉树不支持修改  中序遍历是有序的
{

	K _key;
	V _value;
	BSTnode<K, V>* _left;
	BSTnode<K, V>* _right;

	BSTnode(const K& key, const V& value)

		:_key(key)
		, _value(value)
		, _left(nullptr)
		, _right(nullptr)
	{}
};

之后二叉树的功能有插入 删除  查找 遍历   这其中只有insert 需要修改  既要插入value 也要插入key  但对于删除 查找 遍历 只要有key就可以完成 所以就不需要改变

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;
}

这里通过一段string类型的进行测试

int main()
{
	keyvalue::BSTree <string, string> tt;
	tt.insert("left","左边");
	tt.insert("right", "右边");
	tt.insert("insert", "插入");
	tt.insert("string", "字符串");

	string str;
	while (cin >> str)
	{
		auto ret = tt.find(str);
		if (ret)
		{
			cout << "->" << ret->_value << endl;
		}
		else
		{
			cout << "无此单词 请重新输入" << endl;
		}
	}
	//tt.insert();

	return 0;
}

通过查找key 就可以确定对应的存储value内容  非常方便   这里最后使用的是ctrl+z来结束程序执行

  这里使用到了 operator>>(string)这个函数的返回值istream 会被operator bool 转换成bool值来进行判断是否结束程序  而当我们输入ctrl+z  就会转换成bool值false 这样就会结束程序

这里的key/value除了可以运用在字典序中 还可以运用在计数上

int main()
{
	// 统计水果出现的次数
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜",
   "苹果", "香蕉", "苹果", "香蕉" };
	keyvalue::BSTree<string, int> countTree;
	for (const auto& str : arr)
	{
		// 先查找水果在不在搜索树中
		// 1、不在,说明水果第一次出现,则插入<水果, 1>
		// 2、在,则查找到的节点中水果对应的次数++
		//BSTreeNode<string, int>* ret = countTree.Find(str);
		auto ret = countTree.find(str);
		if (ret == NULL)
		{
			countTree.insert(str, 1);
		}
		else
		{
			ret->_value++;
		}
	}
	countTree.inorder();

	return 0;
}

 接下来我们写一下二叉树的析构

    ~BSTree()
{
	destroy(_root);
	_root = nullptr;
}

void destroy(node*root)
	{
		if (root == nullptr)
			return;
		destroy(root->_left);
		destroy(root->_right);
        delete root;
	}

这里需要用到destroy函数这是因为析构函数是没有参数的 而二叉树的析构有需要用到参数 所以嵌套了一个destroy函数  这里使用的是递归  先销毁左边  在销毁右节点  最后销毁跟节点

接下来写一下 拷贝构造 

由于我们现在没有写拷贝构造 使用的是浅拷贝 会出问题

int main()
{
	keyvalue::BSTree <string, string> tt;
	tt.insert("left","左边");
	tt.insert("right", "右边");
	tt.insert("insert", "插入");
	tt.insert("string", "字符串");
	keyvalue::BSTree<string, string> t(tt);
	return 0;
}

这时代码是会崩溃的

BSTree(const BSTree<K,V>& t)
{
	_root = copy(t._root);
}	
node* copy(node* root)
	{
		if (root == nullptr)
		{
			return 0;
		}
			node* newroot = new node(root->_key, root->_value);
		     newroot->_left = copy(root->_left);
		     newroot->_right = copy(root->_right);

			return newroot;
		
	}

 这里同样需要传参  所以进行了嵌套copy函数  这里如果二叉树为空就返回  如果不为空 开始拷贝  从根节点开始首先赋值 之后链接对应左右孩子 这里左右孩子的拷贝通过递归完成

写完成之后运行会出问题

这是因为没有默认构造函数 这里我们写一个比较快捷的方式

	BSTree() = default;

这样拷贝构造就可以正常运行了

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

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

相关文章

【C++】12.string类的使用

文章目录 1. 为什么学习string类&#xff1f;1.1 C语言中的字符串1.2 两个面试题(暂不做讲解) 2. 标准库中的string类2.1 string类(了解)2.2 auto和范围for 3. 查看技术文档4. string的访问5. 如何读取每个字符呢&#xff1f;6. auto语法糖&#xff08;C11&#xff09;7. 范围f…

spring boot 2.7整合Elasticsearch Java client + ingest attachment实现文档解析

一、软件环境 软件版本号备注Spring boot2.7.23.x版本建议使用ElasticSearch8.xElasticSearch7.17.4ElasticSearch 7.x 可使用JDK 8 ElasticSearch 8.x 要求使用JDK 11 二、安装ElasticSearch 下载地址&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/el…

网站建设中,虚拟主机的各项指标和参数

虚拟主机的各项指标和参数主要包括空间大小、并发连接数、带宽限制、流量限制、CPU限制、内存以及IO速度等。以下是对这些指标和参数的详细介绍&#xff1a; 空间大小&#xff1a;空间大小通常以MB或GB为单位&#xff0c;表示虚拟主机可以容纳的数据量。例如&#xff0c;一个1…

地级市-城市创业活跃度(每百人新创企业数)(2000-2021年)

城市创业活跃度通常指一个城市在一定时期内新创企业的数量和质量&#xff0c;它反映了城市的创业环境、创业者的积极性和创造力。根据中的研究&#xff0c;创业活跃度&#xff08;Entre_Activation&#xff09;作为反映区域层面创业活动积极程度的核心指标&#xff0c;被广泛用…

【Vue】Vue扫盲(二)指令:v-for 、v-if、v-else-if、v-else、v-show

【Vue】Vue扫盲&#xff08;一&#xff09;事件标签、事件修饰符&#xff1a;click.prevent click.stop click.stop.prevent、按键修饰符、及常用指令 文章目录 一、v-for遍历数组数组角标遍历对象&#xff1a;Key作用介绍 二、v-if、v-show基本用法&#xff1a;案例&#xff1…

【unity框架开发12】从零手搓unity存档存储数据持久化系统,实现对存档的创建,获取,保存,加载,删除,缓存,加密,支持多存档

文章目录 前言一、Unity对Json数据的操作方法一、JsonUtility方法二、Newtonsoft 二、持久化的数据路径三、数据加密/解密加密方法解密方法 四、条件编译指令限制仅在编辑器模式下进行加密/解密四、数据持久化管理器1、存档工具类2、一个存档数据3、存档系统数据类4、数据存档存…

【Photoshop——肤色变白——曲线】

1. 三通道曲线原理 在使用RGB曲线调整肤色时&#xff0c;你可以通过调整红、绿、蓝三个通道的曲线来实现黄皮肤到白皮肤的转变。 黄皮肤通常含有较多的红色和黄色。通过减少这些颜色的量&#xff0c;可以使肤色看起来更白。 具体步骤如下&#xff1a; 打开图像并创建曲线调…

几何完备的3D分子生成/优化扩散模型 GCDM-SBDD - 评测

GCDM 是一个新的 3D 分子生成扩散模型&#xff0c;与之前的 EDM 相比&#xff0c;GCDM 优化了其中的图神神经网络部分&#xff0c;使用手性敏感的 SE3 等变神经网络 GCPNET 代替了 EDM 中的 EGNN&#xff0c;让节点间消息传递、聚合根据手性不同而进行。本文对 GCDM-SBDD&#…

DMN决策引擎入门知识点

本文主要讲解Camunda是如何使用Dmn决策引擎&#xff0c;体验地址:www.jeecgflow.com Dmn决策表定义 Dmn在线设计 命中策略(Hit Policy) 策略名称策略描述Unique只有一个或者没有规则可以满足。决策表的结果包含满足规则的输出条目。如果超过一个规则满足&#xff0c;那么就违…

电脑知识:适用于 Windows 10 的 PDF 编辑器列表

PDF 是一种流行的、多功能且安全的文件格式&#xff0c;用于在线共享文档。但是&#xff0c;如果没有合适的应用程序&#xff0c;查看和编辑 PDF 文件可能会变得复杂。 幸运的是&#xff0c;有很多 PDF 编辑器可以帮助您更正重要文档上的错误、填写表格、为合同添加签名、更改…

【个人成长】编程小白如何成为大神?

1. 选择适合自己的编程语言 作为新手&#xff0c;选择一门适合自己的编程语言至关重要。不同的编程语言有不同的应用领域和特点。以下是几种适合初学者的编程语言&#xff1a; Python&#xff1a;广泛应用于数据科学、人工智能、自动化脚本和Web开发等领域。它语法简洁易懂&a…

Faker:自动化测试数据生成利器

Faker&#xff1a;自动化测试数据生成利器 前言1. 安装2. 多语言支持3. 常用方法3.1 生成姓名和地址3.2 生成电子邮件和电话号码3.3 生成日期和时间3.4 生成公司名称和职位3.5 生成文本和段落3.6 生成图片和颜色3.7 生成用户代理和浏览器信息3.8 生成文件和目录3.9 生成UUID和哈…

GPIO的原理

GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口 可配置为8种输入输出模式 引脚电平&#xff1a;0V~3.3V&#xff0c;部分引脚可容忍5V 输出模式下可控制端口输出高低电平&#xff0c;用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 输入…

【Iceberg分析】Iceberg 1.6.1 源码使用IDEA本地编译

Iceberg 1.6.1 源码使用IDEA本地编译 文章目录 Iceberg 1.6.1 源码使用IDEA本地编译下载文件配置调整gradle相关修改bulid.gradlegradle.properties在IDEA上构建编译打包 可能出现的问题彩蛋与Spark部署Spark与Iceberg集成部署 下载 网络条件允许的情况下&#xff0c;使用git直…

引领智慧文旅新纪元,开启未来旅游新境界

融合创新科技&#xff0c;重塑旅游体验&#xff0c;智慧文旅项目定义旅游新未来 在全球化的浪潮中&#xff0c;旅游已成为连接世界的重要纽带。天津信之鸥科技有限公司&#xff08;以下简称“信鸥科技”&#xff09;今日宣布&#xff0c;公司倾力打造的智慧文旅项目正式投入运营…

10.继承与Data Member

目录 1、只要继承不要多态 2、加上多态 3、多重继承 4、虚拟继承 在C继承模型中&#xff0c;一个derived class object所表现出来的东西&#xff0c;是其自己的members加上其base class(es) members的总和。至于derived class members和base class(es) members的排列顺序&a…

基坑气膜:为清洁施工提供强力保障—轻空间

随着城市建设的不断推进&#xff0c;环保要求也日益提高。基坑气膜作为一种新型的施工技术&#xff0c;不仅在防尘降噪方面表现出色&#xff0c;还能支持复杂的施工设备运行&#xff0c;真正实现了从源头解决扬尘和噪音问题。 高效防尘&#xff0c;优化施工环境 传统施工中&…