红黑树的插入Java实现

package practice;

public class TestMain {
    public static void main(String[] args) {
        int[] ao = {5, 1, 18, 3, 8, 20, 13, 16, 12};
        Integer[] a = new Integer[9];
        for (int i = 0; i < a.length; i++) {
            a[i] = new Integer(ao[i]);
        }
        RedBlackBST<Integer,String> tree= new RedBlackBST<Integer,String>();
        for (int i = 0; i < a.length; i++) {
            tree.put(a[i], a[i].toString());
        }

        tree.print();
    }
}
/* * 红黑树 * 与2-3树比较,红链接即表示像2-3树中的3-节点4-节点一样在"同一位置"(将红链接画平) */
class RedBlackBST <K extends Comparable<K>, V> {
    private static final boolean RED   = true;
    private static final boolean BLACK = false;

    private Node root;

    private class Node{
        K key;
        V value;
        Node left, right;
        int N;
        boolean color;

        public Node(K key, V value, int N, boolean color) {
            this.key   = key;
            this.value = value;
            this.N     = N;
            this.color = color;
        }
    }
    /*
     * 插入节点
     */
    public void put(K key, V value) {
        root = put(root, key, value);
    }
    private Node put(Node node, K key, V value) {
        if (node == null) { return new Node(key, value, 1, RED);}
        /*
         * 前面部分与二叉树插入一致,红黑树就是像二叉树一样插入后进行调整(旋转,颜色转换)
         */
        if (compare(key, node.key) < 0)      { node.left = put(node.left, key, value);}
        else if (compare(key, node.key) > 0) { node.right = put(node.right, key, value);}
        else                                 { node.value = value;}
        /*         * 这里的旋转就是为了保证"同一位置"(即一个节点有两条红链接)的三个节点由从小到大排序且中间的节点连着他们的父节点         * 颜色转换即是2-3树中的"向上增长"         */
        if (!isRed(node.left)&&isRed(node.right))    { node = rorateLeft(node);} //左旋
        if (isRed(node.left)&&isRed(node.left.left)) { node = rorateRight(node);} //右旋
        if (isRed(node.left)&&isRed(node.right))     { flipColors(node);} //颜色转换

        node.N = size(node.left) + size(node.right) + 1;
        return node;
    }
    /*
     * 节点左旋 父节点为dad 红节点为son(dad为动图中的E son为图中的S)
     * 当右子节点是红色而左子节点是黑色,就以本节点为dad,右子节点为son进行左旋
     */
    private Node rorateLeft(Node dad) {
        Node son = dad.right;
        dad.right = son.left;
        son.left = dad;
        son.color = dad.color;
        dad.color = RED;
        son.N = dad.N;
        dad.N = size(dad.left) + size(dad.right) +1;
        return son;
    }
    /*
     * 节点右旋 父节点为dad 红节点为son
     * 当左子节点是红色且它的左子节点也是红色,就以本节点为dad,左子节点为son进行右旋
     */
    private Node rorateRight(Node dad) {
        Node son = dad.left;
        dad.left = son.right;
        son.right = dad;
        son.color = dad.color;
        dad.color = RED;
        son.N = dad.N;
        dad.N = size(dad.left) + size(dad.right) +1;
        return son;
    }
    /*
     * 颜色转换
     * 如果这个节点的左右子节点都为红色,就把他们都变为黑色,然后把自己变成红色
     */
    private void flipColors(Node node) {
        node.color = RED;
        node.left.color = BLACK;
        node.right.color =BLACK;
    }
    /*
     * 是否为红
     */
    private boolean isRed(Node node) {
        if (node == null) { return false;}
        return node.color == RED;
    }
    /*
     * 树的大小
     */
    private int size(Node node) {
        if (node == null) { return 0;}
        else              { return node.N;}
    }
    /*
     * key1 <  key2 -1
     * key1 >  key2  1
     * key1 == key2  0
     */
    private int compare(K key1, K key2) {
        return key1.compareTo(key2);
    }
    public void print() {
        print(root);
    }
    private void print(Node node) {
        if (node == null) {
            return;
        }
        print(node.left);
        System.out.println("key = "+node.key+" node.N = "+node.N);
        print(node.right);
    }

}

插入图示(S,E,A,R,C,H,X,M,P对应5,1,18,3,8,20,13,16)

左旋转

右旋转

颜色转换

时间: 2024-10-21 06:01:54

红黑树的插入Java实现的相关文章

红黑树的插入

一.红黑树的介绍 先来看下算法导论对R-B Tree的介绍: 红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black.通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的. 前面说了,红黑树,是一种二叉查找树,既然是二叉查找树,那么它必满足二叉查找树的一般性质.下面,在具体介绍红黑树之前,咱们先来了解下 二叉查找树的一般性质:1.在一棵二叉查找树上,执行查找.插入.删除等操作,的时间复杂度为O(

图解集合7:红黑树概念、红黑树的插入及旋转操作详细解读

原文地址http://www.cnblogs.com/xrq730/p/6867924.html,转载请注明出处,谢谢! 初识TreeMap 之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增.删.改.查,从存储角度考虑,这两种数据结构是非常优秀的.另外,LinkedHashMap还额外地保证了Map的遍历顺序可以与put顺序一致,解决了HashMap本身无序的问题. 尽管如此,HashMap与LinkedHashMap还是有自己

红黑树的插入和删除

一.红黑树的简介 红黑树是一种平衡的二叉查找树,是一种计算机科学中常用的数据结构,最典型的应用是实现数据的关联,例如map等数据结构的实现. 红黑树有以下限制: 1. 节点必须是红色或者是黑色 2. 根节点是黑色的 3. 所有的叶子节点是黑色的. 4. 每个红色节点的两个子节点是黑色的,也就是不能存在父子两个节点全是红色 5. 从任意每个节点到其每个叶子节点的所有简单路径上黑色节点的数量是相同的. 要说明一下限制3.一般在红黑树中,每个节点空指针处还会加空的黑色的孩子(称为岗哨).所以限制3一定

红黑树之插入

1.红黑树 (1).概念 i>每个结点不是红的就是黑的: ii>根结点为黑的: iii>红结点的孩子必为黑结点: iv>(除了根结点)任一结点不管通过什么路径,到达叶子节点的黑结点数目一定相同: 总结概括:一头一脚黑,黑同红不连:根为黑,到脚(叶子节点)的黑结点相同,红结点不相连: 2.递归--->一般先写if结束语句 化非递归------>用while()循环和栈; enum{RED, BLACK}; 这个枚举是有值得,分别为0.1: 3.红黑树与AVL树  AVL树

红黑树(2) - 插入操作

1.插入介绍 首先以二叉排序树的方法增加节点并标记它为红色.(为何不是红色?因为如果设为黑色,就会导致根到叶子的所有路径中,有一条路径上会多出一个额外的黑节点,这个是很难调整的).但是,设为红色节点后,可能会导致出现两个连续红色节点的冲突,则可以通过重新着色和旋转来调整.具体的调整操作取决于其他临近节点的颜色. 下面分析一下插入新节点后可能对红黑树性质产生的影响: 性质1-节点是红色或黑色.和性质3-所有叶子都是黑色.这两条总是可以维持不变. 性质4-每个红色节点的两个子节点都是黑色.只在增加红

红黑树的插入与删除

红黑树(Red Black Tree) 是一种自平衡二叉查找树.红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能.红黑树可以在O(log n)时间内完成查找,插入和删除操作. 二叉搜索树可以看 二叉搜索树 AVL树可以看 AVL树的插入与删除 1. 红黑树的性质 红黑树的自平衡依赖于它的以下性质: 性质1. 结点是红色或黑色. 性质2. 根结点是黑色. 性质3. 每个结点节点(NIL结点,空结点,与其它二叉搜索树不同,红黑树将叶子结点的孩子

红黑树从头至尾插入和删除结点的全程演示图

红黑树插入和删除结点的全程演示 作者:July.saturnman.时间:二零一一年三月二十八日.出处:http://blog.csdn.net/v_JULY_v.声明:版权所有,侵权必究.----------------------------------- 引言: 目前国内图书市场上,抑或网上讲解红黑树的资料层次不齐,混乱不清,没有一个完整而统一的阐述.而本人的红黑树系列四篇文章(详见文末的参考文献),虽然从头至尾,讲的有根有据,层次清晰,然距离读者真正做到红黑树了然于胸,则还缺点什么. 而

红黑树的插入和遍历时间复杂度分析

红黑树的插入和遍历时间复杂度分析 在平常的工作中,最常用的一种数据结构恐怕是std::map了.因此对其的时间复杂度分析是有必要的,编写程序时做到心中有底. 一.理论分析 在stl中std::map和std::set都采用红黑树的方式实现.我们知道插入一个元素到红黑树的时间为log(N),其中N为当前红黑树的元素个数,因此,采用插入方式构建元素个数为N的红黑树的时间复杂度为: log(1) + log(2) + log(N-1) = log((N-1)!) = Nlog(N) 那么采用迭代器遍历

红黑树的插入操作

1 package Tree; 2 3 import org.junit.Test; 4 5 class RedBlackTreeNode { 6 7 int key = 0; 8 RedBlackTreeNode left = null; 9 RedBlackTreeNode right = null; 10 RedBlackTreeNode parent = null; 11 // 色域,0表示黑色,1表示红色 12 int color; 13 14 public RedBlackTreeN