lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

红黑树在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; // 返回当前节点
    }
}
posted on 2023-04-01 16:28  白露~  阅读(81)  评论(0编辑  收藏  举报