首页 > 编程语言 >红黑树及JAVA实现

红黑树及JAVA实现

时间:2023-04-01 16:45:58浏览次数:38  
标签:Node right JAVA 实现 黑树及 color key 节点 left

 

红黑树在Java中的应用

红黑树在Java中有很多应用。例如,

Java 8中的HashMap容器和TreeMap容器都有红黑树的具体应用。HashMap在插入和查找时都需要对键进行哈希,而TreeMap则是按照键的自然顺序进行排序。

因此,当需要对键进行排序时,可以使用TreeMap;

当不需要排序时,可以使用HashMap。

另外,Java中的ConcurrentSkipListMap也是基于红黑树实现的2。

 

红黑树的定义

红黑树是一颗二叉查找树,且具有如下特性:
    (1) 每个节点或者是黑色,或者是红色。
    (2) 根节点是黑色。
    (3) 每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点!]
    (4) 如果一个节点是红色的,则它的子节点必须是黑色的。
    (5) 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑色节点。

红黑树和AVL树有什么区别?

红黑树和AVL树都是自平衡的二叉查找树,但是它们的平衡策略不同。

AVL树是一种更加严格的平衡二叉树,它要求每个节点的左右子树高度差的绝对值不超过1。因此,AVL树的查找速度更快,但是插入和删除操作需要更多的旋转操作来保持平衡。

而红黑树则是一种近似平衡的二叉查找树,它要求每个节点要么是红色,要么是黑色,并且满足以下性质:

(1)根节点是黑色;

(2)每个叶子节点都是黑色;

(3)如果一个节点是红色,则它的两个子节点都是黑色;

(4)从任意一个节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。因此,红黑树的插入和删除操作比AVL树更快,但是查找速度稍慢一些。

 

 

 

红黑树的JAVA实现

红黑树是一种自平衡的二叉查找树,它的特点是每个节点上都有存储位表示节点的颜色,可以是红色或黑色。在插入和删除的时候通过变换颜色和旋转来保持这种约束,以达到自平衡。下面是一个 Java 实现红黑树的例子:

public class RedBlackTree {
    private static final boolean RED = true;
    private static final boolean BLACK = false;
    private class Node {
        int key;
        Node left;
        Node right;
        boolean color;
        Node(int key) {
            this.key = key;
            this.left = null;
            this.right = null;
            this.color = RED;
        }
    }
    private Node root;
    public RedBlackTree() {
        root = null;
    }
    private boolean isRed(Node x) {
        if (x == null) return false;
        return x.color == RED;
    }
    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 put(int key) {
        root = put(root, key);
        root.color = BLACK; // 根节点为黑色
    }
    private Node put(Node h, int key) {
        if (h == null) return new Node(key);
        if (key < h.key) h.left = put(h.left, key);
        else if (key > h.key) h.right = put(h.right, key);
        else ; // 如果key已经存在,则不做任何操作
        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; // 返回当前节点
    }
}

标签:Node,right,JAVA,实现,黑树及,color,key,节点,left
From: https://www.cnblogs.com/shoshana-kong/p/17278839.html

相关文章

  • JAVA-方法
    1.1方法的定义[修饰符列表] 返回值类型方法名(第一个首字母小写,后边单词大写)(形参列表){方法体};ps:方法遵循自上而下运行1.2方法调用类名.方法名(实参列表)方法调用时,压栈!结束时弹栈!先进后出!   1.2方法重载1.2.1定义......
  • JAVASE:注解与反射笔记
    JavaSE:注解与反射(Annotation&Reflection)​注解和框架是所有框架的底层,如Mybatis,spring。框架的底层实现机制就是注解和反射。注解相比于注释,除了能较为直接的表示出这部分模块的功能,也能实现一定的具体功能。01初识注解1.1什么是注解Annotation是从JDK5.0引入......
  • java方法-稀疏数组
    稀疏数组当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组稀疏数组的处理方式是:记录数组一共有几行几列,有多少个不同值把具体不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模如图:左原始数组,右稀疏数组 ......
  • HTML + javascript implement a draggable list 一个可以拖拽交换顺序的列表
    Reference:https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragover_event<body><styletype="text/css">.draggable{text-align:center;background:red;width:20px;......
  • Java protected 关键字详解
    很多介绍Java语言的书籍(包括《Java编程思想》)都对protected介绍的比较的简单,基本都是一句话,就是: 被protected修饰的成员对于本包和其子类可见。这种说法有点太过含糊,常常会对大家造成误解。实际上,protected的可见性在于两点:基类的protected成员是包内可见的,并且对子类......
  • java开发技术栈如何选型
    前言   2023泰山景区门票免费政策是从1月21日到3月31,今天4.1起不再免费啦,泰山的人、山和系统终于平安的渡劫过去!   洪峰时疯狂的抢票、各类攻击,分销MT两次凌晨抗洪事件,我及其我的团队又一次得到历练。 此处插个广告,有需要景区票务系统的可联系我,业务推荐有重礼!  ......
  • 第一次JAVA博客
    一.前言第一次写blog,心灵还是有些小激动的,对于没有写过博客的自己,就算是以完成任务的形式,我还是很愿意去写它的,虽然几千字的博客并不很轻松,但是我把它当作对自己过去三星期在JAVA里旅途的回望,对我付出无数心血的pta大作业的再一次审视,对我这段时间学习的一次总结。第一次作业1......
  • Java多线程(一篇从0讲透)
    多线程思维导图看天下:1.概述并行与并发并行:指两个或多个事件在同一时刻发生(同时发生)并发:指两个或多个事件在同一个时间段内发生。(交替执行)线程与进程进程:是指一个内存中运行的程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程记忆:进程的英文......
  • junit单元测试报错:java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
    今天在复习的时候对对一些知识点进行巩固,用到了junit-4.12.jar,手动导入jar包,然后运行然后报错:java.lang.NoClassDefFoundError:org/hamcrest/SelfDescribing。刚开始我以为代码错了,看了看发现不是代码的问题,是导包的问题。然后查询了百度,发现了是版本的问题:然后说换个低版本的就......
  • JAVA基础
    1关键字1.1关键字全部小写2变量2.1什么是变量?变量就是在内存中存储的最基本的单元(可变)2.2变量的使用三要素:数据类型,变量名,值;inti=100;ps:JAVA中必须声明后再赋值才能访问!同一个......