初探红黑树-插入操作原理

事实总是因为人的欲望产生的,

想要才会有,而当大多数人想的一样的时候

就只会变成后人所得到生活

往复

引:

红黑树,应运而生

啊(叹气),反正我是这么认为的

比原来的它略显成熟,但又涉世不深,却又显其独到的风采

述:

需求,是红黑树的生来原因,哪方面呢,姑且我认为是效率

规则引来查询二叉树,简简单单,不复杂,说一就是一,说再见就再也不会见

但人的关系总是很复杂,规则也是相对的。当然也渲染到了查询二叉树身上

红黑树也只是复杂的其中一种而已,满足人们的欲求不满,可以这么说么?

路口一

基本理解树

基本理解二叉树

懂,普通查询二叉树的规则

理解,普通查询二叉树的不足

了解,红黑树的规则

针对看得懂伪代码不明白为什么case x,case x的人

就够了,否则就在这个路口选择离开吧

路口二

在这再次灌输一个概念,

网上的教程很多,当然我这也不算是教程,只是自己的想法。

大部分教程没见过有自己想法的,抄书倒是抄的6的不行。

*-*-*-*-*-*-*-*-*-*I‘m 分割线*-*-*-*-*-*-*-*-*-*红黑树无非就是拥有新的规则的查询二叉树

  叙述过程中先假设点东西

    p指父亲的父亲

    w指父亲的兄弟

    z指当前节点

在添加了新规则后

1.改善查询二叉树的平衡性

  文字叙述:目的也是为了使树本身平衡,不要使根节点到某一叶结点的过于极端,从而较低查询效率

  图叙述:插入顺序为5-4-6-7-8的结果,普通查询二叉树(图1),红黑树(图2)

  

     图1             图2

2.引入新概念黑高度

  文字叙述:某一点的黑高度就是其到叶结点的所经过颜色为黑的节点数

  图叙述:根算法导论上图不太一样,但还是一个意思

  

*-*-*-*-*-*-*-*-*-*I‘m 分割线*-*-*-*-*-*-*-*-*-*

插入后修改节点颜色操作

  需求:插入元素后任然遵守规则

  方法:穷尽所有可能

  思路:因为插入后只可能影响到父节点和根节点从而破坏规则,所以可能就可以基本的确定

  实际情况:

  *-*-*-*I‘m 小分割线*-*-*-*

  情况一:w是红色

  分析:因为z是红色,所以p一定为黑色

  解决

    文字:

      1.p染红,w染黑

      应该有的想法:w是红色,p就染红,w就染黑。有人问过为什么么?为什么这么做就可以了?为什么不先旋转玩玩,再干点别的什么,喝一杯抽根烟什么的?

      个人看法:要改变点的颜色,就得确保改变后不影响它子女的红黑性质,才可以通过修改颜色达到目的。因为w是红色,改变它的颜色不会改变它子女的红黑性质,所以不需要旋转(后面会介绍什么时候需要)。w不影响,p呢,的确是影响,所以它重新进入循环!那有人说了,改变w不改变它的H么?这里还是要明确H是整体的要求!

      分析:没变化之前H的情况为图1,加入节点后此时H平衡但违反了红节点子女一定为黑节点的规则,思路是将p的黑色下降到子女节点上,从而在不改变H的情况下,恢复被破坏的规则(图2、3),然后将p作为新插入的节点再次进入循环,但p为根节点时,也就会结束循环,但根不为黑,这时为确保这一规则,在不论任何条件结束循环都要将根节点染黑(图4)       

    图:

    

              图1                图2

      

             图3             图4

  *-*-*-*I‘m 小分割线*-*-*-*

  情况二:w是黑色

  分析:因为z是红色,所以p一定为黑色

  解决

    文字:

      1.将z做适当旋转,在将新的父节点做适当旋转【什么叫做适当?】,并将旋转后的w染红,父节点染黑

      应该有的想法:为什么突然就旋转了,改改颜色不就好了么,为什么上面的情况不需要呢?

      个人看法:w是黑色,若是直接通过修改颜色,加入改了w,黑->红,那它的子女玩意有红怎么办?是不是w也坏掉了?是不是还得修复w,这就不是你的目的了,目的就是要修复一个,不影响其他!所以先旋转,将这个w做适当旋转,致使不影响它的情况下通过修改颜色达到目的。当然旋转在删除操作的修改方面可能不是这个意思,这个在后面再次讨论。但在插入方面还是觉得就是这个意思。

      分析:假设在情况一图4继续添加元素8。为什么要左旋呢?因为在现有的结构上做修改,修改w必破坏它的黑高度,会将问题复杂化也就是会不经意间将w作为新的z重新调整,所以要旋转,将w先完全置问题之外。旋转后,因为新的w的黑高度比z~(也就是原来的z)大1,这时将其变红,H减1,但是旋转后的父节点的H少了1,将其变黑,使总体H不变。

      

                        图1                    图2  

        

                  图3                             图4

      2.什么叫做适当?

      适当也就是相对,假如还是情况一图4,但是z变成了父节点的左子,旋转之后(图5),那我只能说是悲剧,影响就大了,到底是修改那个点呢,原来的w也牵扯进去了,就算再次修改,就不是z~一个点了,w也要改,所以要适当,也就是算法导论case2、case3的区别。

      

            图5

      图:单独放图感觉达不到理解的感觉,就穿插的玩了。

后记:

1.写好了,居然不小心全没了,但写一次就是一次新的发现。

2.没有写第二遍,我都忘记我多久没有自己思考了,当然只局限与算法这方面。

3.音乐贴更新了。

时间: 2024-11-08 17:20:17

初探红黑树-插入操作原理的相关文章

红黑树-插入操作

红黑树的五个性质: 1)每个结点要么是红的,要么是黑的. 2)根结点是黑的. 3)每个叶结点,即空结点(NIL)是黑的. 4)如果一个结点是红的,那么它的俩个儿子都是黑的. 5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点. 红黑树插入的几种情况: 1.树是空的,直接将节点设置为根节点,颜色为黑: public void case1(RBnode T,RBnode newNode){        if(newNode.getParent()==null){         

红黑树插入详解

查找二叉树插入节点: 已知查找二叉树的性质为根节点的值大于左子树的值,小于右子树的值,按照此规律,根据要插入的值为其寻找合适的插入位置,最后将其插入即可: Tree-Insert(T,z) { x = root(T); y = NULL; while(x != NULL) { y = x; if(key[z] < key[x]) x = left[x]; else x = right[x]; } p[z] = y; if(y == NULL) root[T] = z; else if(key[z

红黑树插入删除节点过程分析 &amp;&amp; C代码实现

红黑树的插入和删除规则: 红黑树的五个性质 1.    每个节点要么是红的,要么是黑的 2.    根节点时黑色的 3.    每个叶节点(叶节点既指树尾端NIL指针或NULL节点)是黑色的 4.    如果一个节点时红的,那么它的两个儿子都是黑色的 5.    对每个节点,其到叶节点树尾端NIL指针的每一条路径都包含相同数目的黑节点 这里所说的"叶节点"或者"NULL节点",它不包含数据而只充当树在此结束的知识. 二叉树的左旋和右旋这里不再讲解 红黑树的插入操作:

红黑树 插入

红黑树是一种二叉搜索树,每个节点增加一位来储存节点的颜色,红或黑. 红黑树通过如何一条从跟到叶子的路径上各个节点的着色方式的限制,红黑树确保没有一条路径比另一条路径长两倍. 其他性质: 根节点是黑色. 红色节点的子节点都为黑色. 叶子节点或NULL空节点都为黑色.所有原来的叶子节点都有NULL的空节点作为新的叶子节点,取代了自己的叶子节点的身份,即,所有的NULL节点都是黑色的意思. 最重要一点:任何一节点到叶子节点的NULL指针的路径经过的黑色节点数相同. 插入: 左旋 以节点p为支点的话,即

jdk源码分析红黑树——插入篇

红黑树是自平衡的排序树,自平衡的优点是减少遍历的节点,所以效率会高.如果是非平衡的二叉树,当顺序或逆序插入的时候,查找动作很可能会遍历n个节点 红黑树的规则很容易理解,但是维护这个规则难. 一.规则 1.每个节点要么是红色.要么是黑色 2.根节点一定是黑色 3.红色节点不可以连续出现(父节点.子节点不可同时为红) 4.从任意节点出发,到树底的所有路线,途径的黑节点数量必须相同 在修改红黑树的时候,切记要维护这个规则.一般默认插入红色节点(除非是root节点),插入后再进行旋转和颜色变换 二.旋转

红黑树插入和删除的情况分析

红黑树是特殊二叉查找树的一种,一颗红黑树有以下5种性质: 1.根节点为黑色. 2.每个节点不是黑色就是红色. 3.每个红色节点的两个儿子一定是黑色. 4.所有的叶子节点都是黑色.(注:这里的叶子节点并不是真正意义上的叶子节点,而是一种只有颜色属性但不存放数据的节点,而且其没有儿子节点) 5.一个红黑树的中任取一个节点,从它所在位置到其他任何叶子节点的简单路径上所经过的黑色节点数相同. 这2个性质决定了从根节点到叶子节点的最长路径不可能大于最短路径的2倍.所以红黑树是一个大致平衡的二叉树.但跟AV

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

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

红黑树插入与删除完整代码(dart语言实现)

之前分析了红黑树的删除,这里附上红黑树的完整版代码,包括查找.插入.删除等.删除后修复实现了两种算法,均比之前的更为简洁.一种是我自己的实现,代码非常简洁,行数更少:一种是Linux.Java等源码版本的实现,实现的略为复杂,但效率更高.两种算法经过测试,在百万级的数据上效率不分伯仲:1000万的数据中,我自己的实现比Linux内核版本的运行时间多2秒左右. 红黑树的插入相对简单,本文中的代码实现与Linux源码版本也略有差异,效率差别不大. 其他方法,如查找.遍历等,比较简单,不多做解释.遍历

红黑树插入操作

通过具体分析每一步的操作来理解插入过程,将每一步操作之后的树结构打印出来可以帮助我们理解,在图中"#"表示黑色,"~"表示红色,空结点(NULL)都为黑色,但是没有被打印出来,看图像的时候注意一下就可以了. 下面将整个过程贴出来,所有的步骤都是通过程序实现的. Inserting 61 ----------------------------------------------------- case 1 <61> (若当前结点是根结点,则将其颜色设置为