数据结构中红黑树的概念以及代码

红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,它在插入和删除节点时通过一系列的旋转和重新着色操作来保持平衡。红黑树的平衡性质使得它的查找、插入和删除操作的时间复杂度都能保持在 O(log n)

红黑树的定义如下:

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点是黑色的。
  3. 每个叶子节点(NIL节点,即空节点)是黑色的。
  4. 如果一个节点是红色的,则它的两个子节点都是黑色的。
  5. 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点。

下面是一个简单的红黑树的实现示例(使用Python语言):

# 定义红黑树节点类
class Node:def __init__(self, key):self.key = keyself.left = Noneself.right = Noneself.parent = Noneself.color = 1  # 1表示红色,0表示黑色# 定义红黑树类
class RedBlackTree:def __init__(self):self.NIL = Node(None)  # 空节点self.root = self.NIL# 左旋操作def left_rotate(self, x):y = x.rightx.right = y.leftif y.left != self.NIL:y.left.parent = xy.parent = x.parentif x.parent == self.NIL:self.root = yelif x == x.parent.left:x.parent.left = yelse:x.parent.right = yy.left = xx.parent = y# 右旋操作def right_rotate(self, x):y = x.leftx.left = y.rightif y.right != self.NIL:y.right.parent = xy.parent = x.parentif x.parent == self.NIL:self.root = yelif x == x.parent.left:x.parent.left = yelse:x.parent.right = yy.right = xx.parent = y# 插入节点def insert(self, key):node = Node(key)node.parent = self.NILnode.left = self.NILnode.right = self.NILnode.color = 1  # 新插入的节点为红色y = Nonex = self.rootwhile x != self.NIL:y = xif node.key < x.key:x = x.leftelse:x = x.rightnode.parent = yif y == None:self.root = nodeelif node.key < y.key:y.left = nodeelse:y.right = nodeif node.parent == None:node.color = 0  # 如果插入的是根节点,则将其颜色设置为黑色returnif node.parent.parent == None:returnself.insert_fixup(node)# 插入修复操作def insert_fixup(self, node):while node.parent.color == 1:if node.parent == node.parent.parent.right:y = node.parent.parent.leftif y.color == 1:node.parent.color = 0y.color = 0node.parent.parent.color = 1node = node.parent.parentelse:if node == node.parent.left:node = node.parentself.right_rotate(node)node.parent.color = 0node.parent.parent.color = 1self.left_rotate(node.parent.parent)else:y = node.parent.parent.rightif y.color == 1:node.parent.color = 0y.color = 0node.parent.parent.color = 1node = node.parent.parentelse:if node == node.parent.right:node = node.parentself.left_rotate(node)node.parent.color = 0node.parent.parent.color = 1self.right_rotate(node.parent.parent)if node == self.root:breakself.root.color = 0# 中序遍历红黑树def inorder(self, node):if node != self.NIL:self.inorder(node.left)print(node.key, end=" ")self.inorder(node.right)# 测试红黑树
tree = RedBlackTree()
tree.insert(10)
tree.insert(20)
tree.insert(30)
tree.insert(40)
tree.insert(50)
tree.insert(60)
tree.insert(70)
tree.insert(80)
tree.inorder(tree.root)

红黑树作为一种自平衡的二叉搜索树,具有以下优点和缺点:

优点:

  1. 平衡性:红黑树通过旋转和重新着色操作来保持树的平衡,使得树的高度相对较低,从而保证了查找、插入和删除操作的时间复杂度为 O(logn),在最坏情况下也能保证 O(logn) 的性能。
  2. 高效的插入和删除操作:红黑树的插入和删除操作相对较快,因为它能够通过旋转和重新着色来保持树的平衡,而不需要像平衡二叉搜索树那样频繁地进行调整。
  3. 适用于高效的查找操作:红黑树是一种二叉搜索树,因此可以进行高效的查找操作。它可以快速定位到目标节点,并且具有较好的平均性能。

缺点:

  1. 相对复杂:相比于其他简单的数据结构,红黑树的实现相对复杂,需要处理旋转和重新着色等操作,因此实现起来可能会比较困难和容易出错。
  2. 额外的存储空间:为了维护红黑树的平衡性,每个节点需要额外存储一个颜色标记,这会占用额外的存储空间。
  3. 不适合频繁的插入和删除操作:虽然红黑树的插入和删除操作相对较快,但是频繁的插入和删除操作会导致频繁的平衡调整,影响性能。如果应用场景需要频繁地插入和删除节点,可能会有更适合的数据结构选择。

红黑树在平衡性和高效的查找、插入和删除操作方面具有优势,但相对复杂,需要额外的存储空间,并且不适合频繁的插入和删除操作。

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

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

相关文章

【短时交通流量预测】基于单层BP神经网络

课题名称&#xff1a;基于单层BP神经网络的短时交通流量预测 版本时间&#xff1a;2023-04-27 代码获取方式&#xff1a;QQ&#xff1a;491052175 或者 私聊博主获取 模型简介&#xff1a; 城市交通路网中交通路段上某时刻的交通流量与本路段前几个时段的交通流量有关&…

「爬虫职海录」三镇爬虫

HI&#xff0c;朋友们好 「爬虫职海录」第三期更新啦&#xff01; 本栏目的内容方向会以爬虫相关的“岗位分析”和“职场访谈”为主&#xff0c;方便大家了解一下当下的市场行情。 本栏目持续更新&#xff0c;暂定收集国内主要城市的爬虫岗位相关招聘信息&#xff0c;有求职…

Python给图片加水印

受到“手动给证件加文字太麻烦”的感触&#xff0c;想用Python来实现给图片加水印&#xff0c;这不方便多了。 这里使用PIL模块&#xff1a; from PIL import Image from PIL import ImageFont from PIL import ImageDrawimg_t Image.open(cat.jpg) img_size_t img_t.size…

《剑指offer》76--删除链表中重复的结点[C++]

目录 题目&#xff1a; 思路&#xff1a; 贴代码&#xff1a; 代码输出 题目&#xff1a; 在一个排序的链表中&#xff0c;存在重复的结点&#xff0c;请删除该链表中重复的结点&#xff0c;重复的结点不保留&#xff0c;最后返回链表头指针。 如&#xff1a; 链表1->…

合泰HT66F2390----定时器中断学习笔记

前言 无需多言 直接开始定时器中断 的学习 通过上次的PWM学习&#xff0c;上次用的是周期型TM定时器模块 这次使用标准型TM定时器模块&#xff08;STM&#xff09; 代码 #include <HT66F2390.h>void Timer0_Init(void){_stm0c0 0b00001000;_stm0c1 0b11000001;_stm…

【论文精读】Mask R-CNN

摘要 基于Faster RCNN&#xff0c;做出如下改变&#xff1a; 添加了用于预测每个感兴趣区域(RoI)上的分割掩码分支&#xff0c;与用于分类和边界框回归的分支并行。mask分支是一个应用于每个RoI的FCN&#xff0c;以像素到像素的方式预测分割掩码&#xff0c;只增加了很小的计…

List类

目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers list中还有一些操作&#xff0c;需要用到时大家可参阅list的文档说明。 1.2.6 list的迭代…

一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读!

一本书讲透ChatGPT&#xff0c;实现从理论到实践的跨越&#xff01;大模型技术工程师必读 个人简介前言内容简介作者简介专家推荐读者对象购买链接直播预告参与方式 个人简介 &#x1f3d8;️&#x1f3d8;️个人主页&#xff1a;以山河作礼。 &#x1f396;️&#x1f396;️:…

第八节 龙晰Anolis 8.8 安装 DDE 桌面环境

一、前言 最小化安装的龙晰 Anolis OS 8.8 是不带图形化界面的&#xff0c;只能使用命令行&#xff0c;有些时候需要用到桌面环境&#xff0c;而DDE (Deepin Desktop Enviroment) 就是很好的桌面环境&#xff0c;它是指龙晰 Anolis 所搭载的中国自主桌面环境&#xff0c;用起来…

【SpringBoot教程 01】SpringBoot简介及工程搭建

前言&#xff1a;什么是SpringBoot&#xff1f; SpringBoot是一个开源的Java基础框架&#xff0c;它被设计来简化Spring应用的初始搭建以及开发过程。这个框架利用了“约定优于配置”的理念&#xff0c;提供了一系列大型项目中常用的默认配置&#xff0c;让开发者可以快速启动和…

向量数据库Chroma教程

引言 随着大模型的崛起,数据的海洋愈发浩渺无垠。受限于token的数量,无数的开发者们如同勇敢的航海家,开始在茫茫数据之海中探寻新的路径。他们选择了将浩如烟海的知识、新闻、文献、语料等,通过嵌入算法(embedding)的神秘力量,转化为向量数据,存储在神秘的Chroma向量…

1999-2022年30省平均受教育年限(含原始数据和具体计算过程+计算结果)

1999-2022年30省平均受教育年限&#xff08;含原始数据和具体计算过程&#xff09; 1、时间&#xff1a;1999-2022年 2、范围&#xff1a;30省&#xff08;剔除西藏&#xff09; 3、计算方式&#xff1a;平均受教育年限&#xff08;未上学人数*0小学人数*6初中人数*9高中人数…