Java红黑树实现Map简单示例

news2025/1/30 13:44:15

红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,它是由 Rudolf Bayer 在 1972 年提出的,后来由 Leo J. Guibas 和 Robert Sedgewick 在 1978 年发表的论文中形式化定义。

红黑树具有以下特性:
1.节点颜色:每个节点都具有颜色属性,通常是红色或黑色。
2.根节点和叶子节点:根节点和叶子节点(NIL 节点)的颜色为黑色。
3.相邻节点颜色:不能有两个相邻的红色节点,即红色节点的子节点和父节点不能同时为红色。
4.黑色高度:任何一条从根节点到叶子节点(NIL节点)的路径上,黑色节点的数量必须相同,这个数量称为黑色高度。

由于红黑树具有这些特性,它能够保持在插入、删除等操作过程中的平衡状态,使得树的高度保持在较低水平,从而保证了查找、插入和删除操作的时间复杂度始终是O(log n)。

红黑树在实际中被广泛应用,尤其是在实现各种数据结构和算法中,比如在 Java 中的 TreeMap、TreeSet等集合类的实现中就使用了红黑树。因为红黑树具有较好的平衡性和高效性,能够快速地支持查找、插入和删除等操作,适用于很多需要快速查找、有序存储的场景。

下面这段代码是类似于 Map 的简单实现,实际的 Map 实现中,还可能包含更多的功能,比如支持迭代、删除、更新等操作,以及更复杂的实现方式。

public class RedBlackTree {
    private static final boolean RED = true;
    private static final boolean BLACK = false;

    private static class Node {
        int key;
        String value;
        Node left, right;
        boolean color;

        public Node(int key, String value, boolean color) {
            this.key = key;
            this.value = value;
            this.color = color;
        }
    }

    private Node root;

    // 左旋转操作
    private Node rotateLeft(Node h) {
        Node x = h.right;
        h.right = x.left;
        x.left = h;
        x.color = h.color;
        h.color = RED;
        return x;
    }

    // 右旋转操作
    private Node rotateRight(Node h) {
        Node x = h.left;
        h.left = x.right;
        x.right = h;
        x.color = h.color;
        h.color = RED;
        return x;
    }

    // 颜色翻转操作
    private void flipColors(Node h) {
        h.color = RED;
        h.left.color = BLACK;
        h.right.color = BLACK;
    }

    // 插入操作
    public void insert(int key, String value) {
        root = insert(root, key, value);
        root.color = BLACK;
    }

    private Node insert(Node h, int key, String value) {
        if (h == null)
            return new Node(key, value, RED);

        if (key < h.key)
            h.left = insert(h.left, key, value);
        else if (key > h.key)
            h.right = insert(h.right, key, value);
        else
            h.value = value; // 更新值

        if (isRed(h.right) && !isRed(h.left))
            h = rotateLeft(h);
        if (isRed(h.left) && isRed(h.left.left))
            h = rotateRight(h);
        if (isRed(h.left) && isRed(h.right))
            flipColors(h);

        return h;
    }

    // 判断节点颜色
    private boolean isRed(Node x) {
        if (x == null)
            return false;
        return x.color == RED;
    }

    // 查找操作
    public String search(int key) {
        Node node = search(root, key);
        return node == null ? null : node.value;
    }

    private Node search(Node x, int key) {
        if (x == null)
            return null;
        if (key < x.key)
            return search(x.left, key);
        else if (key > x.key)
            return search(x.right, key);
        else
            return x;
    }

    public static void main(String[] args) {
        RedBlackTree tree = new RedBlackTree();
        tree.insert(1, "A");
        tree.insert(2, "B");
        tree.insert(3, "C");
        tree.insert(4, "D");
        //tree.insert(5, "E");
        tree.insert(6, "F");
        tree.insert(7, "G");
        tree.insert(8, "H");

        System.out.println("Key 3 的值为:" + tree.search(3));
        System.out.println("Key 5 的值为:" + tree.search(5));
        System.out.println("Key 8 的值为:" + tree.search(8));
        System.out.println("Key 9 的值为:" + tree.search(9));
    }
}

运行一下

在这里插入图片描述

可以看到 insert 方法类似于Map中的put方法,search方法类似于Map中的get 方法

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

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

相关文章

java数据结构与算法刷题-----LeetCode653. 两数之和 IV - 输入二叉搜索树

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 前序遍历加hash2. 中序遍历双指针 1. 前序遍历加hash 解题思…

(上海电力展)2024上海国际智慧电力与电气设备展览会

2024上海国际智慧电力与电气设备展览会 2024 Shanghai International Intelligent Power and Electrical Equipment Exhibition 时 间&#xff1a;2024年7月13-15日 地 点&#xff1a;上海新国际博览中心 展会简介Introduction 随着全球进入互联网和数字经济时…

逻辑分析仪分析硬件spi

一&#xff0c;cubemx配置好后&#xff0c;使用spi接口发送数据&#xff1b; 发送5个字节&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff1b; 第1个字节&#xff1a;1&#xff1b; 第2个字节&#xff1a;2&#xff1b; 第3个字节&#xff1a;3&am…

【趣玩一下】StreamDiffusion一秒100张!实时生成二次元老婆照!

源代码 https://github.com/cumulo-autumn/StreamDiffusion 基础原理 首先Stream Batch&#xff0c;是将原来顺序的去噪步骤改为批量化处理。允许在一个批处理中&#xff0c;每幅图像处于去噪流程的不同阶段。 如此一来&#xff0c;可以大大减少UNet推理次数&#xff0c;显著…

基于单片机的医院输液系统设计

目 录 摘 要 Ⅰ Abstract Ⅱ 引 言 1 1系统方案设计与论证 3 1.1系统硬件结构总体设计方案 3 1.2点滴速度测量电路方案的选择与论证 3 1.3液面检测电路方案的选择与论证 4 1.4通过电机控制滴速电路的方案与论证 4 1.5显示器接口电路方案选择与论证 5 1.6键盘接口电路方案选择与…

十:套接字和标准I/O,以及分离I/O流

1 标准I/O函数的优点 C语言标准IO整理 1.1 标准I/O函数的两个优点 标准I/O函数具有良好的移植性。 标准I/O函数可以利用缓冲提高性能 从图中可以看出&#xff0c;使用标准I/O函数传输数据时&#xff0c;经过两个缓冲。例如&#xff0c;使用fputs函数传输字符串 “Hello” 时…

数据分析-Pandas数据的画图设置

数据分析-Pandas数据的画图设置 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&#x…

TypeScript(四)枚举类型(Enum Types),类型别名(Type),运算符

一、枚举类型 使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。 枚举类型的特点 可以给一组数值取上一个更好理解的名字&#xff1b;一个枚举中只会存在几个固定的值&#xff0c;并不会…

C语言第三十六弹---文件操作(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 文件操作 1、文件的顺序读写 1.1、顺序读写函数介绍 1.1.1、fgetc 与 fputc 1.1.2、fgets 与 fputs 1.1.3、fscanf 与 fprintf 1.1.4、fread 与 fwrite 1.…

【vue3之组合式API及其新特性】

组合式API及其新特性 一、setup1.写法2.如何访问3.语法糖4.同步返回对象 二、reactive()和ref()1.reactive()2.ref() 三、computed四、watch函数1.侦听单个数据2.侦听多个数据3. immediate4. deep5.精确侦听对象的某个属性 五、生命周期函数六、组件通信1.父传子2. 子传父 七、…

云消息队列 Confluent 版正式上线!

作者&#xff1a;阿里云消息队列 前言 在 2023 年杭州云栖大会上&#xff0c;Confluent 成为阿里云技术合作伙伴&#xff0c;在此基础上&#xff0c;双方展开了深度合作&#xff0c;并在今天&#xff08;3月1日&#xff09;正式上线“云消息队列 Confluent 版”。 通过将 Co…

基于51单片机心率脉搏计设计

目 录 摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 系统方案设计 3 1.2 系统总体设计 4 2 硬件设计 5 2.1 主控电路 5 2.2 驱动电路 8 2.3 信号采集电路 10 2.4 显示电路 13 2.5 总体电路图设计 15 3 软件设计 16 3.1 软件开发环境的介绍 16 3.2 系统重要函数介绍 16 4…

解决QMYSQL driver not loaded问题

前言 之前都是在Qt5.51上开发&#xff0c;连接mysql数据库一直没有问题&#xff0c;换到5.15.2后一直报错 一查才发现\5.15.2\msvc2019_64\plugins\sqldrivers目录下没有qsqlmysql了&#xff0c;5.5.1是有的&#xff0c;5.15.2是要自己编译的。。。 下载源码 安装qt的时候没…

大型多模态智能体:综述

论文链接&#xff1a;https://arxiv.org/abs/2402.15116 大型语言模型&#xff08;LLMs&#xff09;在推动文本基础的智能体方面已经取得了超群的性能&#xff0c;赋予它们类似人类的决策和推理能力。与此同时&#xff0c;一个新兴的研究趋势集中于将这些LLM驱动的智能体扩展到…

这套系统架构,同事直呼666

你使用的每一个热门应用程序的背后,都有一个由架构、测试、监控和安全措施组成的软件系统。今天让我们看一下满足生产环境应用程序的高级架构由哪些体系组成。 CI/CD 管道 我们的第一个关键领域是持续集成和持续部署——CI/CD 管道。 这确保了我们的代码从存储库出发,经过…

【TOP】中科院1区TOP,Elsevier出版社,仅2-3个月录用!

【SciencePub学术】 01 期刊基本信息 【期刊简介】IF&#xff1a;5.0-5.5&#xff0c;JCR1区&#xff0c;中科院1区TOP&#xff1b; 【版面情况】正刊&#xff0c;仅10篇版面&#xff1b; 【检索情况】SCIE在检&#xff0c;预计3个月左右录用&#xff1b; 【征稿领域】有关…

图机器学习(2)-图的基本表示

0 复习 1 图的基本表示 1.1 本体图Ontology 疾病和食物之间的关系&#xff1a;能吃、不能吃、推荐吃。 1.2 图的种类 药物和药物之间的副作用就是异质图&#xff1a; 二分图是一种特殊的异质图&#xff1a; 1.3 节点连接数 通过节点数可以说明节点的重要度。 1.4 邻接…

.NetCore6.0实现ActionFilter过滤器记录接口请求日志

文章目录 目的实现案例&#xff1a;一.首先我们新建一个WebApi项目二.配置 appsettings.json 文件&#xff0c;配置日志存放路径三.创建 Model 文件夹&#xff0c;创建AppConfig类和ErrorLog类1.在AppConfig类中编写一个GetConfigInfo方法获取配置文件中的值2.在ErrorLog类中&a…

Apache Flink连载(三十七):Flink基于Kubernetes部署(7)-Kubernetes 集群搭建-3

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录

重庆有哪些媒体资源?活动展会媒体邀约

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 重庆作为中国的一个直辖市&#xff0c;拥有丰富的媒体资源&#xff0c;涵盖电视台、广播电台、报纸、杂志以及网络媒体等各个领域。这些媒体不仅是传播新闻和信息的重要渠道&#xff0c;…