zoukankan      html  css  js  c++  java
  • 红黑树

    1. 红黑树的定义

    a. 二叉查找树,任何一个节点的左右子树的高度差不超过两倍

    b. 根节点为黑色

    c. 红色节点的父节点和子节点的颜色必须是黑色

    d. 从任何一个叶节点到根节点的路径经过相同数目的黑色节点

    2. 二叉树的调整,结构的调整和颜色的调整

    a. 设置插入节点x的颜色为红色

    b. 判断插入节点的父节点颜色为红色还是黑色

    b.1 父节点的颜色为红色

    继续判断父节点是否是左节点,下面按照父节点是左节点来的,如果父节点是右子节点,将插入节点通过右旋调整到父节点位置,父节点成为子节点。

    b.1.1 父节点的兄弟节点为红色

    调整方案:

     

    需要继续向上调整,因为c节点的颜色为红色,需要判断c节点的父节点颜色是红色还是黑色

    b.1.2 父节点的兄弟节点为黑色

    b.1.2.1.1 如果当前节点是父节点的右子节点

    调整方案

    后面的同b.1.2.2

    最终结果:

    b.1.2.2 如果当前节点是父节点的左子节点

    调整方案

    b.2 父节点的颜色为黑色

    不需要调整

    java TreeSet 调整的代码如下:

        private void fixAfterInsertion(Entry<K,V> x) {
            x.color = RED;
    
            while (x != null && x != root && x.parent.color == RED) {
                if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
                    Entry<K,V> y = rightOf(parentOf(parentOf(x)));
                    if (colorOf(y) == RED) {
                        setColor(parentOf(x), BLACK);
                        setColor(y, BLACK);
                        setColor(parentOf(parentOf(x)), RED);
                        x = parentOf(parentOf(x));
                    } else {
                        if (x == rightOf(parentOf(x))) {
                            x = parentOf(x);
                            rotateLeft(x);
                        }
                        setColor(parentOf(x), BLACK);
                        setColor(parentOf(parentOf(x)), RED);
                        rotateRight(parentOf(parentOf(x)));
                    }
                } else {
                    Entry<K,V> y = leftOf(parentOf(parentOf(x)));
                    if (colorOf(y) == RED) {
                        setColor(parentOf(x), BLACK);
                        setColor(y, BLACK);
                        setColor(parentOf(parentOf(x)), RED);
                        x = parentOf(parentOf(x));
                    } else {
                        if (x == leftOf(parentOf(x))) {
                            x = parentOf(x);
                            rotateRight(x);
                        }
                        setColor(parentOf(x), BLACK);
                        setColor(parentOf(parentOf(x)), RED);
                        rotateLeft(parentOf(parentOf(x)));
                    }
                }
            }
            root.color = BLACK;
        }
  • 相关阅读:
    求有序数组中不重复数字的出现次数
    ThreadLocal在Spring事务管理中的应用
    spring声明式的事务管理
    bootstrap-table 下一页点击失效
    IE浏览器下ajax和缓存的那些事儿
    vue学习第二步——目录结构
    vue学习第一步——自动化构建项目
    bootstrap-select 默认搜索
    webuploader的一些坑
    easyUI combobox 添加空白项
  • 原文地址:https://www.cnblogs.com/feng-ying/p/10642486.html
Copyright © 2011-2022 走看看