红黑树-迭代器实现

news2024/11/18 21:44:10

目录

迭代器自增

当前结点存在右子树

当前结点没有存在右子树

迭代器自增完整代码

迭代器自减

 迭代器自减代码:


迭代器自增

红黑树的迭代器应该怎么实现呢?现在我模仿大佬的实现逻辑。

我们迭代器最重要是可以允许自增与自减的实现的。

会发现我们遍历的时候我们迭代器是根据红黑树的最左边结点进行遍历数据的。

当前结点存在右子树

虽然看图我们知道下一个我们是遍历1结点,但是我我们并不知道0的右边有没有东西,所以我们需要判断。

	Self& operator++()
	{
		if (_node==nullptr)
		{
			return *this;
		}
		if (_node->_right)
		{
			//下一个就是右子树的最左结点
			Node* left = _node->_right;
			while (left->_left)
			{
				left = left->_left;
			}
			_node = left;
		}
		else
		{
            //当前结点不存在右子树的访问
		}
		return *this;
	}

所以我们需要先判断我们的当前位置是否存在右子树,如果没有才能访问上一级结点。

当前结点没有存在右子树

当我们没有当前结点没有右子树就会访问当前结点的上层结点

 然后再次it++,当前结点存在右子树,it来都右子树的最左结点(没有2结点没有左子树,那么自己就是最左结点)。

 这时我们在it++,当前结点没有右子树返回上级,但是我们的上级结点1已经被访问过了,所以我们需要在当前结点右子树为空的时候返回上级需要判断当前结点是否是上级结点的右子树,如果是迭代的再去上层找,找这一路径里是父节点的左子树位置,然后将该父节点赋值给it。

 访问到最后,it会到整棵树的根的父节点nullptr

 代码:

	Self& operator++()
	{
		if (_node==nullptr)
		{
			return *this;
		}
		if (_node->_right)
		{
			//下一个就是右子树的最左结点
		}
		else
		{
			//右子树为空,找这一层里不是父节点的右的哪个
			Node* parent_nf = _node->_parent;
			Node* _cur = _node;
			while (parent_nf&&parent_nf->_right == _cur)//存在到最后一个结点会访问
                                            //到整棵树的根结点的父结点,就是访问完毕
			{
				_cur = parent_nf;
				parent_nf = parent_nf->_parent;
			}
			_node = parent_nf;
		}
		return *this;
	}

迭代器自增完整代码

Self& operator++()
{
	if (_node == nullptr)
	{
		return *this;
	}
	if (_node->_right)
	{
		//下一个就是右子树的最左结点
		Node* left = _node->_right;
		while (left->_left)
		{
			left = left->_left;
		}
		_node = left;
	}
	else
	{
		//右子树为空,找这一层里不是父节点的右的哪个
		Node* parent_nf = _node->_parent;
		Node* _cur = _node;
		while (parent_nf && parent_nf->_right == _cur)
		{
			_cur = parent_nf;
			parent_nf = parent_nf->_parent;
		}
		_node = parent_nf;
	}
	return *this;
}

迭代器自减

迭代器自减就是和自增反向的逻辑

 迭代器自减代码:

Self& operator--()
{
	if (_node->_left)//当前结点左树存在
	{
		Node* right = _node->_left;
		while (right->_right)//选择左子树的最右结点,
			//就是迭代器自减的下一个位置
		{
			right = right->_right;
		}
		_node = right;//找到左子树的最右节点。
	}
	else /*if(_node->left==nullptr)*/ //当前结点左子树存在
	{
		Node* parent_nf = _node->_parent;
		Node* _cur = _node;
		while (parent_nf && parent_nf->_left == _cur)
               //寻找当前位置不是父子子树的左子树。
		{
			_cur = parent_nf;
			parent_nf = parent_nf->_parent;
		}
		_node = parent_nf;
	}
	return *this;
}

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

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

相关文章

chatgpt赋能python:Python程序运行速度问题

Python程序运行速度问题 Python是一种高级语言,其语法简洁、易于学习,在科学计算、数据分析、web开发等领域有着广泛的应用。然而,Python程序在运行速度方面却存在一定的瓶颈,这也是许多开发者关注的问题。本文将从多个方面探讨影…

【深度学习笔记】二分类问题与 Logistic 回归

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记,视频由网易云课堂与 deeplearning.ai 联合出品,主讲人是吴恩达 Andrew Ng 教授。刚兴趣的网友可以观看网易云课堂的视频进行深入学习,视频的链接如下: https://m…

chatgpt赋能python:Python等待一秒:介绍和用法全解析

Python等待一秒:介绍和用法全解析 什么是Python等待一秒? 在编写Python脚本时,我们通常要让程序暂停一段时间,这可以通过让程序等待一定的时间来实现。等待时间可以是任意长度的时间,最常见的时间单位是秒。Python中…

chatgpt赋能python:三种常见的Python程序错误及解决方案

三种常见的Python程序错误及解决方案 Python是一种高级编程语言,具有易读、易学、易维护等特点,被广泛应用于Web开发、数据分析、人工智能等领域。但是,即使是有10年Python编程经验的工程师也难免会犯错误。这篇文章将介绍Python程序中的三种…

Unity3D:添加设备

Unity3D:添加设备 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 添加设备 若要将新设备添加到设备模拟器,请创建设备定义和设备覆盖。 设备定义是 Unity 项目中扩展名的文本文件。它包含描述设备属性的 …

数据结构第六章 图 6.4 图的应用 错题整理

4.A A. 不是简单路径的话,有环,去环路径会更短 B. 适合的 弗洛伊德算法才不适合 C. 本来就是 D 2X2矩阵拓展到3X3矩阵 再扩大 若是子集 即加入新顶点后,最短路径都没有变,错 5.B 本题用弗洛伊德更合适 但这道题只需全部代入求最…

chatgpt赋能python:Python简单计算器代码

Python简单计算器代码 Python是一种高级的编程语言,被广泛用于开发各种类型的应用程序,包括计算器应用程序。在本文中,我们将介绍Python简单计算器代码的实现和用法。 Python简单计算器代码介绍 一个简单的计算器能够实现基本的算术运算&a…

回溯注意点:回溯时间复杂度的计算与剪枝操作

文章目录 回溯的时间复杂度计算示例1:77.组合示例2:216.组合总和Ⅲ示例3:17.电话号码字母组合关于剪枝对时间复杂度的影响 回溯的剪枝操作必要性及适用场景示例1:组合剪枝剪枝优化点: 示例2:组合剪枝剪枝优…

STL容器(持续更新中)

一、string类 1. 构造函数 常用的构造函数如下。 构造函数原型含义string()默认构造函数。创建一个默认string对象,长度为0string(const string &s)拷贝构造函数。用一个string对象初始化另一个string对象string(const char *s)用字符串常量构建string对象st…

Linux系统编程(vfork和fork)

文章目录 前言一、vfork讲解二、vfork使用三、exit和_exit1.exit和_exit对比2.在vfork中的使用 四、vfork和fork区别总结 前言 本篇文章讲解vfork和fork创建进程的区别。 一、vfork讲解 vfork 是一个在类Unix操作系统中的系统调用,它创建一个新进程,且…

欠拟合、过拟合、正则化、学习曲线

1.欠拟合、过拟合、正则化、学习曲线 1.1 欠拟合、过拟合 欠拟合:模型相对于要解决的问题来说太简单了,模型并没有拟合训练数据的状态 过拟合:模型相对于要解决的问题来说太复杂了,模型只能拟合训练数据的状态 下图来自&#x…

第41步 深度学习图像识别:Efficientnet建模(Tensorflow)

一、写在前面 (1)Efficientnet EfficientNet是Google在2019年提出的一种新的卷积神经网络架构,主要目标是提高模型的效率,即在保持或提高模型性能的同时,尽可能地降低模型的复杂性和计算需求。 EfficientNet的关键思…

【MySQL】表的内外连接

目录 一、内连接(表1 inner join 表2 on) 1、显示SMITH的名字和部门名称 二、外连接 1、左外连接(表名1 left join 表名2 on) 1.1查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出…

2022(一等奖)D775北部湾红树林生理结构参数对水位变化的响应特征研究

作品介绍 1 应用背景 红树林作为全球生产力最高的生态系统之一,是生长在热带、亚热带海湾的一种特殊的木本植物群落。它由于其独特的海陆过渡特性,在维持滨海生态稳定、促进海陆能量循环中起着重要作用。同时,红树林可以吸附温室气体&#x…

第十二章 EfficientNetv2网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

Python爬取数据并进行数据CRUD的Web可视化项目

项目内容简介 爬取网站https://book.douban.com/top250上面的Top250数据,然后将数据保存到Mysql数据库中,最后这些数据记录以Web的方式进行展示,并实现对这些数据记录的CRUD(增删改查)! 项目实现简介 对豆瓣网站的爬虫的实现。 见项目中的爬取豆瓣Top250脚本(beautifulSoup).…

Linux下MySQL的安装与使用

文章目录 安装前说明Linux系统及工具的准备查看是否安装过MySQLMySQL的卸载 MySQL的Linux版安装下载MySQL指定版本CentOS7下检查MySQL依赖CentOS7下MySQL安装过程 查看MySQL版本服务的初始化启动MySQL,查看状态查看MySQL服务是否自启动 MySQL登录设置远程登录 安装前…

【计算机组成原理】输入输出系统

目录 一、外部设备概述 二、输入输出接口 三、主机与外设交换信息的方式 四、中断系统 五、中断请求 六、中断响应 七、中断服务 一、外部设备概述 外部设备在计算机系统中的作用: 人机对话的重要设备(交互)完成数据媒体变换的设别&…

chatgpt赋能python:Python等待一秒-程序员必知的等待操作

Python等待一秒 - 程序员必知的等待操作 时间是宝贵的资源,你可能会需要让你的Python程序等待一段时间才能继续执行。在这篇文章中,我们将学习如何使用Python等待一秒,包括为什么需要等待,以及在Python中如何等待。 为什么需要等…

前端web入门-CSS-day07

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 定位 相对定位 绝对定位 定位居中 固定定位 堆叠层级 z-index 定位-总结 高级技巧 CSS 精灵 字…