TreeMap

    红黑树有五大特性:
    1)每个结点要么是红的,要么是黑的。
    2)根结点是黑的。
    3)每个叶结点,即空结点(NIL)是黑的。
    4)如果一个结点是红的,那么它的俩个儿子都是黑的。
    5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

    我的理解是:红黑色的操作就两个要点。第一:遵循二叉查找树的规范,对所有元素进行排序,但这里存在着不确定情况,有可能出现左右子树深度极其不对称的情况,导致最坏时间复杂度出现O(n)的情况。 第二:正因为存在二叉树严重不平衡的情况,所以就出现了红黑二叉树,通过标记每个节点的颜色,动态的调整二叉树的结构,使其始终维持在相对平衡的状态,这样做的好处就是查找性能始终维持在O(lgn)的较高水平。

    一、添加元素

    put方法:

    1. x.color = RED;
    2. while (x != null && x != root && x.parent.color == RED) {
    3. if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
    4. Entry<K,V> y = rightOf(parentOf(parentOf(x)));
    5. if (colorOf(y) == RED) {
    6. setColor(parentOf(x), BLACK);
    7. setColor(y, BLACK);
    8. setColor(parentOf(parentOf(x)), RED);
    9. x = parentOf(parentOf(x));
    10. if (x == rightOf(parentOf(x))) {
    11. rotateLeft(x);
    12. }
    13. setColor(parentOf(x), BLACK);
    14. setColor(parentOf(parentOf(x)), RED);
    15. rotateRight(parentOf(parentOf(x)));
    16. }
    17. } else {
    18. Entry<K,V> y = leftOf(parentOf(parentOf(x)));
    19. if (colorOf(y) == RED) {
    20. setColor(parentOf(x), BLACK);
    21. setColor(y, BLACK);
    22. } else {
    23. if (x == leftOf(parentOf(x))) {
    24. x = parentOf(x);
    25. rotateRight(x);
    26. }
    27. setColor(parentOf(x), BLACK);
    28. setColor(parentOf(parentOf(x)), RED);
    29. rotateLeft(parentOf(parentOf(x)));
    30. }
    31. }
    32. }
    33. root.color = BLACK;