红黑树 结构内部算法解析

 /** From CLR */
    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)));

//colorOf(y) 方法如果y==null 是null 返回黑色
                if (colorOf(y) == RED) {
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {//rightOf(parentOf(x)) 得到当前节点父节点 的右子节点
                    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;
    }
//右旋

// 什么时候需要 右旋:// 1: 当前插入节点的父节点 是 祖先节点的左子节点// 2: 当前插入节点的 右叔父节点 为nil 或黑色

 //或者
1: 当前插入节点的父节点 是 祖先节点的右子节点
 /** From CLR */
    private void rotateRight(Entry<K,V> p) {
        if (p != null) {
            Entry<K,V> l = p.left;
            p.left = l.right;
            if (l.right != null) l.right.parent = p;
            l.parent = p.parent;
            if (p.parent == null)
                root = l;
            else if (p.parent.right == p)
                p.parent.right = l;
            else p.parent.left = l;
            l.right = p;
            p.parent = l;
        }
    }

  

//左旋   /** From CLR */
    private void rotateLeft(Entry<K,V> p) {
        if (p != null) {
            Entry<K,V> r = p.right;
            p.right = r.left;
            if (r.left != null)
                r.left.parent = p;
            r.parent = p.parent;
            if (p.parent == null)
                root = r;
            else if (p.parent.left == p)
                p.parent.left = r;
            else
                p.parent.right = r;
            r.left = p;
            p.parent = r;
        }
    }

  

原文地址:https://www.cnblogs.com/softxiaohui/p/11072119.html

时间: 2024-10-12 16:04:41

红黑树 结构内部算法解析的相关文章

Nginx 红黑树结构 ngx_rbtree_t

概述 有关红黑树的基础知识在前面文章中已经做了介绍,想要更详细的了解红黑树可以参考文章<数据结构-红黑树>,在这里只是单纯对 Nginx 中红黑树源码的解析,Nginx 红黑树源码是实现跟算法导论中的讲解是一样的. 红黑树结构 typedef ngx_uint_t ngx_rbtree_key_t; typedef ngx_int_t ngx_rbtree_key_int_t; /* 红黑树节点结构 */ typedef struct ngx_rbtree_node_s ngx_rbtree_

一种新的删除红黑树节点的算法

转载请注明出处:http://blog.csdn.net/mxway/article/details/38080315 下面维基百科上红黑树的5个性质 1.      节点是红色或黑色 2.      根是黑色 3.      所有叶子都是黑色(叶子是NIL节点) 4.      每个红色节点必须有两个黑色的子节点.(从每个叶子到根的所有路径上不能有两个连续的红色节点.) 5.      从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点. 根据上面的5个性质,我们可以得出下面的结论:

一步一图一代码,一定要让你真正彻底明白红黑树【转】

转自:http://blog.csdn.net/chenhuajie123/article/details/11951777 一步一图一代码,一定要让你真正彻底明白红黑树 作者:July   二零一一年一月九日 ----------------------------- 本文参考:I.  The Art of Computer Programming Volume III. Introduction to Algorithms, Second EditionIII.The Annotated S

算法导论 之 红黑树 - 插入[C语言]

作者:邹祁峰 邮箱:[email protected] 博客:http://blog.csdn.net/qifengzou 日期:2013.12.24 21:00 转载请注明来自"祁峰"的CSDN博客 1 引言 在之前的博文中,本人对平衡二叉树的处理做了较详尽的分析,有兴趣的朋友可以参阅博文<算法导论 之 平衡二叉树 - 创建 插入 搜索 销毁>和<算法导论 之 平衡二叉树 - 删除>.平衡二叉树AVL是严格的平衡树,在增删结点时,其旋转操作的次数较多:而红黑树

算法导论 第三部分——基本数据结构——红黑树

红黑树 红黑树是一种二叉查找树,但在每个结点上增加了一个存储位表示结点的颜色,可以是RED或者BLACK.通过对任何一条从根到叶子的路径上各个着色方式的限制, 红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的.当二叉查找树的高度较低时,这些操作执行的比较快,但是当树的高度较高时,这些操作的性能可能 不比用链表好.红黑树(red-black tree)是一种平衡的二叉查找树,它能保证在最坏情况下,基本的动态操作集合运行时间为O(lgn). 1.红黑树的性质 #define RED 0

java数据结构和算法06(红黑树)

这一篇我们来看看红黑树,首先说一下我啃红黑树的一点想法,刚开始的时候比较蒙,what?这到底是什么鬼啊?还有这种操作?有好久的时间我都缓不过来,直到我玩了两把王者之后回头一看,好像有点儿意思,所以有的时候碰到一个问题困扰了很久可以先让自己的头脑放松一下,哈哈! 不瞎扯咳,开始今天的正题: 前提:看红黑树之前一定要先会搜索二叉树 1.红黑树的概念 红黑树到底是个什么鬼呢?我最开始也在想这个问题,你说前面的搜索二叉树多牛,各种操作效率也不错,用起来很爽啊,为什么突然又冒出来了红黑树啊? 确实,搜索二

浅析红黑树算法

红黑树简介 红黑树是一种自平衡二叉查找树,也有着二叉搜索树的特性,保持着右边始终大于左边结点key的特性.前面提到过的AVL树,也是二叉搜索树的一种变形,红黑树没有达到AVL树的高度平衡,换句话说,它的高度,并没有AVL树那么高的要求,但他的应用却更加的广泛,实践中是相当高效的,他可以在O(log n)的时间内做查找.插入.删除操作.在C++ STL中,set.multiset.map.multimap等都应用到的红黑树的变体. 红黑树在平衡二叉搜索树的前提下,每个节点新增了 _color 这一

算法--红黑树实现介绍(二)

一.概述 在前一篇中我们回顾了红黑树的特点及添加的处理,可以得知红黑树首先是一个二叉查找树,在此基础上通过增加节点颜色的约束来使得红黑树近似平衡.当我们添加或者删除节点时,我们需要对树进行调整以使其重新满足红黑树.这涉及到节点颜色的变化及部分节点的旋转.关于节点的旋转,以及添加时的处理我们已经介绍完了,所以本文重点介绍红黑树的删除. 二.红黑树的特点 在介绍删除时,我们还是再来回顾一下红黑树的五个特点,如下: 1)节点的颜色是红色或者黑色 2)树的根节点为黑色 3)树的叶子节点为黑色 4)如果一

C高级 框架开发中红黑树结构

引言  -- 红黑树历史 红黑树是数据结构学习中一道卡. 底层库容器中必不可少的算法. 历经各种实战运用,性能有保障. 同样红黑树不好理解, 就算理解了, 代码也不好写. 就算写了, 工程库也难构建. 关于红黑树基础讲解推荐看下面博主的红黑树博文系列,感觉不错. 红黑树(一)之 原理和算法详细介绍 对于红黑树小背景简介摘抄如下: 红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组.它是在1972年由鲁道夫·贝尔发明的,