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

news2024/10/5 20:26:17

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

红黑树的定义如下:

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

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

# 定义红黑树节点类
class Node:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None
        self.parent = None
        self.color = 1  # 1表示红色,0表示黑色

# 定义红黑树类
class RedBlackTree:
    def __init__(self):
        self.NIL = Node(None)  # 空节点
        self.root = self.NIL

    # 左旋操作
    def left_rotate(self, x):
        y = x.right
        x.right = y.left
        if y.left != self.NIL:
            y.left.parent = x
        y.parent = x.parent
        if x.parent == self.NIL:
            self.root = y
        elif x == x.parent.left:
            x.parent.left = y
        else:
            x.parent.right = y
        y.left = x
        x.parent = y

    # 右旋操作
    def right_rotate(self, x):
        y = x.left
        x.left = y.right
        if y.right != self.NIL:
            y.right.parent = x
        y.parent = x.parent
        if x.parent == self.NIL:
            self.root = y
        elif x == x.parent.left:
            x.parent.left = y
        else:
            x.parent.right = y
        y.right = x
        x.parent = y

    # 插入节点
    def insert(self, key):
        node = Node(key)
        node.parent = self.NIL
        node.left = self.NIL
        node.right = self.NIL
        node.color = 1  # 新插入的节点为红色
        y = None
        x = self.root
        while x != self.NIL:
            y = x
            if node.key < x.key:
                x = x.left
            else:
                x = x.right
        node.parent = y
        if y == None:
            self.root = node
        elif node.key < y.key:
            y.left = node
        else:
            y.right = node
        if node.parent == None:
            node.color = 0  # 如果插入的是根节点,则将其颜色设置为黑色
            return
        if node.parent.parent == None:
            return
        self.insert_fixup(node)

    # 插入修复操作
    def insert_fixup(self, node):
        while node.parent.color == 1:
            if node.parent == node.parent.parent.right:
                y = node.parent.parent.left
                if y.color == 1:
                    node.parent.color = 0
                    y.color = 0
                    node.parent.parent.color = 1
                    node = node.parent.parent
                else:
                    if node == node.parent.left:
                        node = node.parent
                        self.right_rotate(node)
                    node.parent.color = 0
                    node.parent.parent.color = 1
                    self.left_rotate(node.parent.parent)
            else:
                y = node.parent.parent.right
                if y.color == 1:
                    node.parent.color = 0
                    y.color = 0
                    node.parent.parent.color = 1
                    node = node.parent.parent
                else:
                    if node == node.parent.right:
                        node = node.parent
                        self.left_rotate(node)
                    node.parent.color = 0
                    node.parent.parent.color = 1
                    self.right_rotate(node.parent.parent)
            if node == self.root:
                break
        self.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.coloradmin.cn/o/1492118.html

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

相关文章

帝国CMS仿某猫办公PPT模板商城整站素材资源下载网站源码带手机端优化版

适合做创意设计模板下载的网站&#xff0c;涵盖行业优质精品PPT模板、视频素材、Word模板、Excel模板、音效及配乐素材等&#xff0c;集办公设计模板于一体&#xff0c;下载办公创意设计模板就选择这块源码&#xff01; 源码下载地址&#xff1a;帝国CMS仿某猫办公PPT模板商城…

基于laspy的点云数据存取及基于Open3D的点云数据可视化

一、基于laspy的点云数据存取 &#xff08;一&#xff09;激光雷达点云数据的LAS存储格式[1] LAS&#xff08;LASer&#xff09;格式是一种为激光雷达点云数据的交换和存档而设计的文件格式&#xff0c;是一种被American Society for Photogrammetry and Remote Sensing&#…

Claude 3正式发布,超越GPT-4,一口气读15万单词,OpenAI最强的大对手!

目录 多模态AI大模型Claude 3&#xff08;https://www.anthropic.com/news/claude-3-family&#xff09;Claude 3 的三个版本新增功能&#xff0c;chatgpt没有的使用成本总结 多模态AI大模型Claude 3&#xff08;https://www.anthropic.com/news/claude-3-family&#xff09; …

C# 中 TryParse 将字符串转换为特定类型的方法

在 C# 中&#xff0c;TryParse 是一个用于将字符串转换为特定类型的方法。它用于尝试解析字符串并将其转换为指定类型的值&#xff0c;而不会引发异常。如果解析成功&#xff0c;它将返回 true 并将解析结果存储在输出参数中&#xff1b;如果解析失败&#xff0c;它将返回 fals…

分析开源机器学习框架TensorFlow

TensorFlow是一个开源的机器学习框架&#xff0c;由Google开发和维护。它提供了一个灵活的编程环境&#xff0c;可用于构建和训练各种机器学习模型。TensorFlow的基本概念和使用场景如下&#xff1a; 张量&#xff08;Tensor&#xff09;&#xff1a;在TensorFlow中&#xff0c…

FairTune:优化参数高效微调以实现医学图像分析的公平性

paper&#xff1a;https://arxiv.org/abs/2310.05055 code&#xff1a; https://github.com/Raman1121/FairTune 摘要和介绍 人工智能在医疗健康应用中的应用正在迅速增长。然而&#xff0c;人工智能模型一再被证明对不同的人口统计学亚群体表现出不必要的偏见——AI模型在由…

《 前端挑战与未来:如何看待“前端已死”》

在技术领域,时常会有一些激进的言论引发热议,比如近年来不少人声称“前端已死”。这样的言论引发了广泛的讨论和反思。本文将从几个方向探讨这个话题:为什么会出现“前端已死”的言论、如何看待这种说法、前端技术的未来发展趋势以及前端人如何应对这场职位突围战。 为什么会…

超级副业SOP,各行各业,太全了!

最近收集到一份资料&#xff0c;包含了几乎各行各业的SOP&#xff0c;实在是太全了&#xff0c;这里准备分享给大家 这里可能有一些朋友还不知道&#xff0c;SOP是个什么东西呢 百度说法&#xff1a;所谓SOP&#xff0c;是 Standard Operating Procedure三个单词中首字母的大写…

Spring Cloud 面试题及答案整理,最新面试题

Spring Cloud中断路器的原理及其作用是什么&#xff1f; Spring Cloud断路器的原理和作用基于以下几个关键点&#xff1a; 1、故障隔离机制&#xff1a; 在微服务架构中&#xff0c;断路器作为一种故障隔离机制&#xff0c;当某个服务实例出现问题时&#xff0c;断路器会“断…

浏览器发出一个请求到收到响应步骤详解

前言 在网络通信中&#xff0c;浏览器向Web服务器发送HTTP请求消息的过程是一个复杂而精密的环节&#xff0c;涉及到URL解析、DNS解析、数据拆分、路由表规则和MAC头部添加等一系列步骤。本文将深入探讨这一过程的每个环节&#xff0c;帮助读者更全面地了解浏览器与Web服务器之…

Python实现MACD工具判断信号:股票技术分析的工具系列(1)

Python实现MACD工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;1&#xff09; 介绍代码rolling函数介绍核心代码计算指数移动平均值计算MACD指标 完整代码 介绍 先看看官方介绍&#xff1a; MACD (平滑异同平均线&#xff09; 指标说明 DIF线&#xff1a;收盘价短…

上传文件,页面loading显示文件上传进度

做项目时&#xff0c;弹窗上传文件时&#xff0c;上传动作无法停止&#xff0c;需要加一个蒙层&#xff0c;阻止上传文件过程中的用户操作&#xff0c;并显示文件上传进度&#xff0c;效果如图。 页面上传文件函数 /** 上传文件函数*/ uploadFile(){let config {onUploadProgr…

全网公开!!苍穹外卖或吉瑞外卖等外卖购物项目如何拓展?简历如何写?已经经过不同公司多轮面试。项目中会问到哪些问题?以及问题如何解决?

文章末尾联系作者&#xff0c;免费获取外卖项目的拓展和讲解资料&#xff0c;祝你面试成功 &#xff01;&#xff01;&#xff01; 文章问题的解答&#xff0c;以及作者的规划进步历程&#xff0c;尽在作者的知识库。 想要加入并查阅作者的知识库可以联系作者 不要白嫖&#…

微信报修小程序源码

源码获取方式&#xff1a; 1、搜一搜 万能工具箱合集 然后点击资料库&#xff0c;即可获取资源 一、先看Demo&#xff08;已更新至4.0.0&#xff09; 想看界面图片的&#xff0c;辛苦你爬一下楼&#xff0c;点击下方查看资源&#xff0c;进入官方demo 二、功能介绍 1、当前版…

关于跨境电商知识产权的英语翻译

随着全球化的发展&#xff0c;跨境电商逐渐成为国际贸易的重要组成部分。在这个领域中&#xff0c;知识产权的保护显得尤为重要。那么&#xff0c;对于跨境电商知识产权英语翻译&#xff0c;怎样做比较好&#xff0c;北京哪个翻译公司比较权威&#xff1f; 业内人士指出&#x…

网络工程师笔记8

华为VRP系统 设备管理方式 web管理方式 命令行管理方式 修改命令&#xff1a;undo 基础配置命令

线上问题——学习记录幂等判断失效问题分析

一、业务流程 上图是对save和saveScore两个接口的流程抽象&#xff0c;save是上传答题数据&#xff0c;saveScore则是上传答题分数&#xff0c;为保证幂等和防止并发调用&#xff0c;这两个接口都加了分布式锁&#xff08;还是两层哦&#xff09;。第一层使用的是不同的锁&…

Nginx使用—基础知识

Nginx简介 Nginx优点 高性能、高并发 支持很高的并发&#xff0c;在处理大量并发的情况下&#xff0c;比其他web服务器要高效 轻量且高扩展 功能模块少(源代码仅保留http与核心模块代码&#xff0c;其余不够核心代码会作为插件来安装) 代码模块化&#xff08;易读&#xff0…

【开源】SpringBoot框架开发固始鹅块销售系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固始鹅块模块2.4 鹅块订单模块2.5 评论管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 鹅块类型表3.2.2 鹅块表3.2.3 鹅块订单表3.2.4 鹅块评论表 四、系统展示五、核心代码5.…

计算文件大小时容易忽略的问题

计算文件大小时容易忽略的问题 1、概述2、问题背景3、解决方案4、结论 1、概述 大家好&#xff0c;我是欧阳方超&#xff0c;可以关注我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。 在处理文件大小时&#xff0c;经常需要将其转换为KB并进行适当处理。然而&…