红黑树(Insert())

news2024/11/25 0:34:57

文章目录

  • 红黑树
    • 代码
    • 红黑树性质
        • 红黑树vsAVL树
    • 红黑树的实现
      • Insert()
          • 情况一:如果我插入的新节点时红色的
          • 情况二:叔叔是黑色或者不存在
          • 情况三: cur红,p为红,g为黑,u不存在或者为黑-双旋
          • 检查
      • erase()
        • 红黑树vsAVL树
    • 红黑树的应用:

红黑树

二叉搜索树

代码

红黑树性质

  • 每个节点不是黑色就是红色.
  • 根节点是黑色
  • 红色节点的孩子节点都是黑色的,所以不存在连续的红色.
  • 对于节点,从该节点到所有后代叶子节点的简单路径上,包含相同数目的黑色节点。
  • 这里的路径不是到叶子结点中止,而是到NULL。
  • 节点个数,最长路径不超过最短路径的2倍。最短路径是全黑,最长路径就是一黑一红。假设每条路径黑节点的数量是N,N<=任意路径长度<=2N
  • 每个叶子节点都是黑色的,这时候的叶子结点是NULL不是平常的叶子结点。在数路径的时候看的不是叶子结点而是NULL的个数,来保证每条路径黑色节点的数目是相等的.

红黑树vsAVL树

image-20230303093945931

AVL树是严格平衡树的左右相差不超过2,AVL左右两端更加均衡,高度更接近logN。红黑树是近似平衡,红黑树两边最坏情况是2logN。AVL树效率更高.

内存中搜索是差不多的,logN足够小,CPU对于这种很小基数的2倍是很快的,几乎无差别,假设是10亿个数,AVL树放30层,红黑树可能是60层,查找30次和60次对于CPU很小.但是AVL是旋转了很多次,红黑树是不一定旋转的。所以综合来说红黑树更优.

红黑树的实现

Insert()

  • 第一次插入是插入那个节点好?

    插入黑节点或者红结点就是在违反规则,所以需要考虑那个代价更小,所以选择红结点。

    • 如果增加叶子结点是黑节点,那么别的路径的黑节点个数怎么平衡?影响太大。

    • 如果插入的是红色,可能父亲是黑色,就没问题;如果父亲是红色就不行,这两种存在概率问题,有空可钻.

情况一:如果我插入的新节点时红色的

父节点是红的,祖父一定是黑的,(没有连续的红结点),所以看叔叔节点,如果是红结点,那么只需要将parentuncle节点都改为黑色,祖父g变成红色(因为祖父不一定是根节点,所以我要保证所有路径黑节点个数相同)

如果g->parent是红色的,就需要cur=g,将祖父当成新增,继续向上调整。如果g-parent是黑色就可以结束了。所以就存在cur可能不是新增节点了,是某一个新增节点的祖父.

  • 所以cur可能是新增,也有可能是新增的祖父节点的n次。

image-20230303101232173

情况二:叔叔是黑色或者不存在

单纯变色不行了,因为最长路径已经超过了最短路径的2倍,就需要旋转一下.旋转的目的就是保持搜索树降低他的高度,让他左右均衡.所以是旋转加变色,先根节点变黑。旋转又分为左右单旋和双旋的情况

  • 右单旋图示(左单旋同理)

image-20230303103333784

情况三: cur红,p为红,g为黑,u不存在或者为黑-双旋

折线,走单旋是没有效果的,只是把左边高变为右边高.所以走双旋.

p为g的左孩子,cur为p的右孩子,则针对p做左单旋转,然后针对g做右单旋

p为g的右孩子,cur为p的左孩子,则针对p做右单旋转.然后针对g做左单旋

image-20230303104627536

检查

完成之后,编译执行正确只能保证这是一棵搜索树,对于红黑树还需要进一步检验。

  1. 根节点的颜色必须是黑色
  2. 如果节点是红色,直接验证他的父亲是不是红色,验证孩子的可能性太多
  3. 前序遍历就是深度优先遍历,路径中统计黑节点个数就行,给定参考值banchmark某一条路径的比如最左路径,遍历一条路径,就将这条路径的值blackNum和基准值比较一次,看看每条路径的黑节点个数是否相等.
bool IsBalance()
	{
		if (_root && _root->_color == RED)
		{
			cout << "根节点不是黑色" << endl;
			return false;
		}
		int banchmark = 0;
		Node* left = _root;
		while (left)
		{
			if (left->_color == BLACK)
			{
				++banchmark;
			}
			left = left->_left;
		}
		int blackNum = 0;
		return _IsBalance(_root, banchmark, blackNum);
	}
bool _IsBalance(Node* root, int banchmark, int blackNum)
	{
		if (root == nullptr)
		{
			if (banchmark != blackNum)
			{
				cout << "存在路径黑色节点的数量不相等" << endl;
				return false;
			}
			return true;
		}
		if (root->_color == RED && root->_parent->_color == RED)
		{
			cout << "连续出现红色节点" << endl;
			return false;
		}
		if (root->_color == BLACK)
		{
			++blackNum;
		}
		return _IsBalance(root->_left, banchmark, blackNum)
			&& _IsBalance(root->_right, banchmark, blackNum)
	}

erase()

大佬博客

红黑树vsAVL树

红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O(logN),红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数,所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用中红黑树更多.

红黑树的应用:

  1. C++ STL库 – map/set、mutil_map/mutil_set
  2. Java 库
  3. linux内核
  4. 其他一些库

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

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

相关文章

分布式框架RabbitMQ详解以及编程特性Base实现

消息队列MQ MQ的主要作用有&#xff1a; 异步 例子: 快递员发快递&#xff0c;直接到客户家效率会很低。引入菜鸟驿站后&#xff0c;快递员只需要把快递放到菜鸟驿站&#xff0c;就可以继续发其他快递去了。客户再按自己的时间安排去菜鸟驿站取快递. 作用:异步能提高系统的…

基于明道云平台重建医院管理流程

一、龙华区医疗信息化建设情况 首先&#xff0c;给大家介绍一下龙华区医疗信息化建设的情况&#xff0c;龙华区位于深圳市的中部&#xff0c;目前下属3家公立医院&#xff0c;2家公共卫生机构。2017年&#xff0c;龙华区提出了建设智慧龙华总体框架方案&#xff0c;龙华区卫生…

FPGA Cameralink图像生成模板,Cameralink采集卡图像采集

FPGA Cameralink图像生成模板&#xff0c;Cameralink采集卡图像采集。1&#xff1a;采集卡安装2&#xff1a;FPGA产生图像模板module vga_lcd_driver(input clk,input [7:0] r_i,input [7:0] g_i,input [7:0] b_i,output [7:0] r_o,output [7:0] g_o,output [7:0] b_o,output d…

《QDebug 2023年2月》

一、Qt Widgets 问题交流 二、Qt Quick 问题交流 三、其他 1.使用 QDir::toNativeSeparators() 转换路径中的 "/" 分割符为 "\" 在网上抄代码的时候&#xff0c;总会遇到这样的代码&#xff1a; file_path.replace("/", "\\"); …

界面开发(3)--- PyQt5用户登录界面连接数据库

文章目录数据库账户注册账号登录找回密码为了实现用户登录界面的登录功能&#xff0c;我们必须建立一个数据库&#xff0c;并把账号和对应的密码&#xff0c;存储到数据库中。如果输入的账号和密码与数据库中的一致&#xff0c;那我们就允许用户登录&#xff0c;进入新的界面。…

win10 WSL2 使用Ubuntu配置与安装教程

Win10 22H2ubuntu 22.04ROS2 文章目录一、什么是WSL2二、Win10 系统配置2.1 更新Windows版本2.2 Win10系统启用两个功能2.3 Win10开启BIOS/CPU开启虚拟化(VT)&#xff08;很关键&#xff09;2.4 下载并安装wsl_update_x64.msi2.5 PowerShell安装组件三、PowerShell安装Ubuntu3.…

WMS相关知识点(二)

目录一、Android 图形显示系统1. 从下层往上层理解一、Android 图形显示系统 1. 从下层往上层理解 1.1 显示屏 显示屏上的内容&#xff0c;是从硬件帧缓冲区的&#xff0c;大致读取过程为&#xff1a;从Buffer的起始地址开始&#xff0c;从上往下&#xff0c;从左往右&#x…

Redis持久化RDB和AOF

Redis 是内存数据库&#xff0c;数据都是存储在内存中&#xff0c;为了避免进程退出导致数据的永久丢失&#xff0c;需要定期将 Redis 中的数据以某种形式&#xff08;数据或命令&#xff09;从内存保存到硬盘。当下次 Redis 重启时&#xff0c;利用持久化文件实现数据恢复。除…

《C++ Primer》 第十二章 动态内存

《C Primer》 第十二章 动态内存 动态内存与智能指针 shared_ptr允许多个指针指向同一个对象&#xff1b;unique_ptr则“独占”所指向的对象&#xff0c;weak_ptr指向shared_ptr所管理的对象。这三种类型都定义在memory头文件中。 shared_ptr类&#xff1a;默认初始化的智能…

Docker容器化部署.net core API

1.为API集成Docker环境。&#xff08;VS自带&#xff0c;傻瓜式操作&#xff09; 1.1 点击项目&#xff0c;右键&#xff0c;添加&#xff0c;选择Docker支持 1.2 找到项目根目录中的Dockerfile文件&#xff0c;这是VS刚刚帮我们自动生成的。进入和做如图标红地方修改。 把文…

map和set 的封装

文章目录引入key-value模型map和set底层setset的几个重要接口mapmap几个重要的接口map和set的封装引入 对于map和set的引入&#xff0c;我们用一道在程序中常见的问题解决&#xff1a; 给定一个数组int arr[]{1,2,1,3,1,4,1,5,5,2,3,4,5};&#xff0c;给出以下问题的解决方案&…

【基础算法】双指针---最长连续不重复子序列

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

html基础(列表(ul、ol、dl)、表格table、表单(input、button、label)、div和span、空格nbsp)

1无序列表<ul>和有序列表<ol>1.1无序列表<ul><!-- 无序列表 --><ul><li>吃饭</li><li>睡觉</li><li>打豆豆</li></ul>1.2有序列表<ol><!-- 有序列表 --><ol><li>吃饭</li…

电机控制中的2个重要变量(速度和转矩)

电机控制的其它相关内容,大家可以参看专栏的系列文章,链接如下: 运动控制系统(伺服3环)_运动控制三环控制周期_RXXW_Dor的博客-CSDN博客1 、这篇作为运动控制系列的第一篇吧,后续慢慢更新关于PLC的运动控制https://blog.csdn.net/m0_46143730/article/details/124075713…

阿里10年测开经验分享-我的软件测试之路也并不是一帆风顺

简单的先说一下&#xff0c;坐标西安&#xff0c;16届本科毕业&#xff0c;目前在跳槽&#xff0c;一共有面试了有5家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09; 其中成功的有5家&#xff0c;另外2…

你不会工作1年了连枚举都还不知道吧?

文章目录一、枚举(Enum)1.1 枚举概述1.2 定义枚举类型1.2.1 静态常量案例1.2.2 枚举案例1.2.3 枚举与switch1.3 枚举的用法1.3.1 枚举类的成员1.3.2 枚举类的构造方法1&#xff09;枚举的无参构造方法2&#xff09;枚举的有参构造方法1.3.3 枚举中的抽象方法1.4 Enum 类1.4.1 E…

Azure OpenAI 官方指南02|ChatGPT 的架构设计与应用实例

ChatGPT 作为即将在微软全球 Azure 公有云平台正式发布的服务&#xff0c;已经迅速成为了众多用户关心的服务之一。而由 OpenAI 发布的 ChatGPT 产品&#xff0c;仅仅上线两个月&#xff0c;就成为互联网历史上最快突破一亿月活的应用。本期从技术角度深度解析 ChatGPT 的架构设…

大数据平台小结

搭建大数据平台启动流程1、启动Nginx服务&#xff08;在bdp-web-mysql服务中&#xff09;cd /usr/local/nginx/# 启动Nginx ./sbin/nginx# 查看端口是否存在 netstat -tunlp|grep 200012、启动zookeeper&#xff08;在bdp-executor-realtime123&#xff09;cd /app/bdp/apache-…

二.项目使用vue-router,引入ant-design-vue的UI框架,引入less

根据前文《使用Vue脚手架工具搭建vue项目》搭建好脚手架后使用 1.vue-router 2.引入UI框架ant design vue 3.引入less 1.vue-router vue-router分为两种模式(默认为hash模式)&#xff1a; hash history hash&#xff1a; 特征&#xff1a; 1.hash会在浏览器路径里带#号&#…

高质量数字化转型创新发展大会暨中国信通院“铸基计划”年度会议成功召开

2023年3月3日&#xff0c;由中国信通院主办的高质量数字化转型创新发展大会暨中国信通院“铸基计划”年度会议在北京成功召开。本次大会深度展示了中国信通院在数字化领域的工作成果&#xff0c;并全面展望了2023年行业的数字化发展趋势。同时&#xff0c;大会发布了中国信通院…