算法导论笔记 红黑树(3)

算法导论笔记 算法导论笔记导论第一课 渐进符号、递归树渐进符号排序算法插入排序 导论 性能是一种软件货币 第一课 渐进符号、递归树 渐进符号 可以理解成函数集合符号: 符号 含义 O符号 T(n) <= O(f(n)) o符号 T(n) < o(f(n)) Ω符号 T(n)>= Ω(f(n)) ω符号 T(n)&amp 阅读详情

//---------------------------15/03/20----------------------------

    

    //删除

    

    //相当于copy一个u给v

    RB_TRANSPLANT(T,u,v)

    {

        if(u,p == T.nil)

        {

            T.root=v;

        }

        else if(u == u.p.left)

        {

            u.p.left=v;

        }

        else

        {

            u.p.right=v;

        }

        v.p=u.p;

    }

    

    //先做普通的树的删除操作,多加了记录颜色,和判断是否修复的操作

    RB_DELETE(T,z)

    {

       

        y=z;

        y_original_color= y.color;  //记录y原来的颜色

        

        //如果z的儿子小于一个

        if(z.left == T.nil) //没有左儿子,把右儿子赋值给x,让z.right成为z。


        {

            x=z.right;

            RB_TRANSPLANT(T,z,z.right);

        }

        else if(z.right == T.nil)   //没有右儿子,做相反的操作

        {

            x = z.left;

            RB_TRANSPLANT(T,z,z.left);

        }

        else                        //有两个儿子

        {

            y=TREE_MINIMUN(z.right);    //找到要移动到z位置的y(min函数可以找到z.right所有子节点中最小的节点

            y_original_color=y.color;

            x=y.right;

            if(y.p == z)                //y就是z的右儿子

            {

                x.p=y;                  //x的父亲是y

            }

            else                    //y是z的右儿子的最左下角的节点(最小的节点)

            {

                RB_TRANSPLANT(T,y,y.right); //让y.right成为y

                y.right=z.right;            //y.right被赋值为z.right

                y.right.p=y;                //y.right.p(y.right已经是z.right了)被赋值为y

                                            //这样z和z.right的连线就替换成y和y.right(之前的z.right)

            }

            RB_TRANSPLANT(T,z,y);           //这里替换z和z.p的连线

            y.left=z.left;

            y.left.p=y;                     //替换和左儿子的连线

            y.color=z.color;                //改变颜色   到此y成功替换掉了z(包括 父亲,儿子,颜色)

        }

        

        if(y_original_color == BLACK)       //如果y原来是黑色的,就要进行修补操作,因为如果y原来是黑色的

                                            //当y被提升到z后,原来y的所有子节点的黑高都会少一

        {

            RB_DELETE_FIXUP(T,x);

        }

            

    }

    

    

    RB_DELETE_FIXUP(T,x);

    {

        /*

            首先给x添加一个黑色属性(并不拿来判断,判断还是用原来的属性)

            当x是红色时 使x代表红黑(红色才是color属性)  x是黑色时 代表 黑黑

            这么假设是为了让y的黑色属性加到x身上(为了使x底下的节点的黑高都加回一)

            这样当x是红色时(红黑) 只要改变x成黑色就可以使

            x和x的所有子节点黑高和原来的一样了.

            如果x已经修补完毕(修补完毕后会有一个操作把x设置为T.root) 或者 x是红色的(只需改变成黑色)

         

        */

        while(x != T.root && x.color == BLACK)

        {

            if(x == x.p.left)

            {

                //w表示x的兄弟节点

                w=x.p.right;

                

                //case1: w是红色的(说明w的父节点和子节点都是黑色),可以把他转化成case 2 3 4

                //左转x.p 并调整颜色保持平衡,这时x的父节点就变成红色了。

                if(w.color == RED)

                {

                    w.color==BLACK;

                    x.p.color=RED;

                    LEFT_ROTATE(T,x.p);

                    w=x.p.right;

                }

                //底下的三种情况w是黑色的

                

                /*

                    case2:w的儿子都是黑色

                    把x和w的黑属性上移(把 黑高加1的这个属性赋给x.p,x还是黑色,w变成红色)

                    这样可以保证x.p这条路径的黑高不变

                    这时x变成了原先的x的父节点,如果x.p是红色那就完成了,否则就开始循环

                */

                if(w.left.color == BLACK && w.right.color == BLACK)

                {

                    w.color= RED;

                    x = x.p;

                }

                else

                {

                    /*

                        case3:w的右儿子是黑色的(这不是我们想要的),那就把他变成红色

                        右转w并重新填颜色(w变成红色,换上来的w的左儿子变成黑色(原本是红色,

                        因为进入case3就说明不可能左右儿子都是黑色,而w的右儿子已经是黑色了)

                        这时候w要再赋值一次,因为w右转下去了,新的w是原来w的左儿子

                    */

                    if(w.right.color == BLACK)

                    {

                        w.left.color = BLACK;

                        w.color=RED;

                        RIGHT_ROTATE(T,w);

                        w= x.p.right;

                    }

                    /*

                        case4:w的右儿子是红色的,此时左转x.p 并改变颜色就完成了(所以要把根节点赋值给x用来判断完成)

                        先左转x.p;

                        把w的颜色变成原来x.p的颜色,这样右边的路径就相当于去掉了w节点,w本来是黑色的,

                        再把w.right变成黑色(原来是红色),此时右边的路径黑高又加了一。右边已经平衡

                        使x.p的颜色变成黑色(不管原来是什么颜色,这个操作相当于添加一个黑色节点),这样x这边的黑高都加一

                        要使这条路径的黑高不变只需要去掉x的黑高加一属性就好(从黑黑变成黑)

                        x的兄弟节点(原来是w的左儿子)他的上面是一个黑色节点(x.p,他原来上面是w,也是黑色的)再上面是

                        w节点(颜色是原来w.p的颜色)所以这部分黑高不变.所以左边也平衡完成。

                    */

                    w.color=x.p.color;

                    x.p.color=BLACK;

                    w.right.color=BLACK;

                    LEFT_ROTATE(T,x.p);

                    x=T.root;

                }

            }

            else

            {

                

            }

        }

        x.color=BLACK;

    }

    

    

    

    

}

《算法导论》第三版第13章 红黑树 练习&思考题 个人答案 13.1 红黑树的性质 13.1-1 解: 完全二叉搜索树: 黑高为2的红黑树: 黑高为3的红黑树: 黑高为4的红黑树: 13.1-2 解:如果标红,不满足性质4,因为35是36的父结点,也是红色;如果标黑,不满足性质5,该条路径黑高超过其他路径。 13.1-3 解:可以验证所得到的树仍然满足5个条件,所以是红黑树。 13.1-4 解: (1)如果“吸收”前两个子结点都已经是黑色了,度为2... 阅读详情

相关推荐

学习 《算法导论》第13章 红黑树 总结二

学习 《算法导论》第13章 红黑树 总结二在学习 《算法导论》第13章 红黑树 总结一中学习了红黑树的五个性质,红黑树的结构定义以及旋转。这节学习红黑树的插入和删除操作。红黑树的插入在一棵n个结点的红黑树中插入一个新结点的操作可以在O(lgn)时间内完成。红黑树的插入分为两步:第一步:把红黑树当成是一棵普通的二叉查找树,把新结点插入这棵二叉查找树;第二步:为保证红黑树的性质,将插入的新结点着色.第一

wan198809的专栏 1736

算法导论复习摘记

期末复习算法导论专用

weixin_46048158的博客 944

红黑树的删除

《算法导论》红黑树删除调整只有四种情形

denghai_csdn的博客 1487

伪代码

参考内容: 如何编写伪代码 1.what is 描述了算法的逻辑,即描述算法的语言。 介于自然语言和编程语言之间,忽略了语言实现的细节,跳脱了语言的限制,有利于个人思考和猿友之间的交流。 伪代码是主观且不标准的。 ...

Moliay的博客 6104

学习算法导论——红黑树旋转插入和删除

红黑树是一棵二叉搜索树,每个节点有一个标志位表示颜色,该颜色可以是红(RED)或黑(BLACK)。通过对任何一条从根到叶子的简单路径上各点的颜色进行约束,就能确保没有一条路径会比其他路径长出2倍,因而是近似于平衡的。 红黑树每个节点有5个属性,color,key,leftChild,rightChild,p。其中color是颜色,key是关键字,leftChild是指向左孩子的指针,rightC

小咸鱼_的博客 6168

《算法导论》深度学习笔记精华

算法是一组定义明确的指令,用于完成特定的任务或解决问题。它是计算机科学的核心,也是软件开发和工程领域不可或缺的组成部分。在IT行业中,优秀的算法往往意味着更高的效率,更好的用户体验以及更优的资源消耗。

weixin_42502089的博客 1306

学习笔记 | 算法导论学习笔记1

《算法导论》打卡1,主要内容:插入排序,分治法,归并排序 第一部分 基础知识 第一章 算法在计算中的作用 1.1 算法 算法就是任何良定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或者值的集合作为输出。 规范书写: 问题:XXXX 输入:XXXXXXXX 输出:XXXXXXXX 算法步骤: 1.XXXXXXXXXXX 2.XXXXXXXXXXX 注意问题与问题实例的区别。 1.2 作为一种技术的算法 考虑效率:时间与空间资源的消耗 第二章 算法基础 2.1 插入排序 输入:n个

Justlovesmile的博客 3503

MIT算法导论公开课的课程笔记(个人总结)

此文档压缩包为麻省理工学院的算法导论公开课的课程笔记,对应的课程视频资源为网易公开课的资源,需要的可自行下载。

从2-3树到 红黑树

原文: 查找(一)史上最简单清晰的红黑树讲解 二叉查找树由于可能会非常的不均衡. 所以用2-3树. 采用上上浮的方法,顶多多两倍节点数.   红黑树一直是数据结构中的难点,大部分关于算法与数据结构的学习资料(包括《算法导论》)对于这部分的讲解都是上来就下定义,告诉我们红黑树这个性质那个性质,插入删除要注意1234点,但是基本没有讲为什么这样定义红色和黑色,让人理解起来十分费力。...

fei33423的专栏 1万+

麻省理工算法导论全套笔记

麻省理工算法导论全套笔记 ,英文版,看好再下哦。

算法导论 读书笔记

《算法导论》读书笔记_附录A习题解答 学习C C++ 资料

红黑树笔记

从结构上来看,简单理解,一个黑色节点带两个红色子节点就可以认为是一个4节点。下图是4节点分解的完整过程。

沈小洋 2156

麻省理工公开课:算法导论(书、讲义、字幕、笔记、答案)

麻省理工公开课:算法导论(书、讲义、字幕、笔记、答案)

【算法导论】红黑树详解之一(插入)

红黑树是建立在二叉查找树的基础之上的,关于二叉查找树可以参看【算法导论】二叉搜索树的插入和删除和【算法导论】二叉树的前中后序非递归遍历实现。对于高度为h的二叉查找树而言,它的SEARCH、INSERT、DELETE、MINIMUM、MAXIMUM等操作的时间复杂度均为O(h)。所以在二叉查找树的高度较高时,上述操作会比较费时,而红黑树就可以解决这种问题。

苦咖啡的自留地 1万+

算法导论读书笔记(整理别人的)

算法导论读书笔记,整理别人的,不算抄袭吧。。

深入解析i2cdetect:从基础命令到高级读写操作

本文深入解析Linux下i2cdetect工具,从基础安装、总线扫描到高级读写操作。作为i2c-tools的核心组件,i2cdetect是硬件调试的得力侦探,能快速识别I2C总线上的设备地址。文章还涵盖了i2cdump、i2cset、i2cget等进阶工具,并介绍了如何在C程序中调用读写接口进行嵌入式开发,是掌握I2C通信调试的实用指南。

weixin_29189987的博客 372

算法导论-9.红黑树习题

这一篇解决《算法导论》中红黑树章节的部分习题,在上一篇自己亲自实现红黑树后,解决这些题目就轻松多了。 练习13.1-6 在一棵黑高度为 $k$ 的红黑树中,内节点最多有多少个?最少有多少个? 黑高度为 $k$ 的二叉树,全高度最小为 $k+1$,最大为 $2k+2$ 。内节点最多有 $2^{k+1}-1$ 个,这种情况下红黑树中没有红节点,黑节点全满(满足所有叶子节点黑高度一致的条件...

dayuan5183的博客 1682

硬件-汽车电子-TBOX/TCAM核心器件选型与系统集成设计指南

本文深入解析汽车电子TBOX/TCAM硬件架构与系统集成设计,涵盖核心器件选型、电源管理、信号完整性优化等关键点。重点分享5G模组选型避坑经验、MCU隐性指标及热设计验证方案,为车载通信系统开发提供实用指南。

weixin_30352645的博客 531

[算法导论笔记]--红黑树

一.什么是红黑树 红黑树是一棵二叉搜索树,其在每个结点上增加了一个存储位来表示颜色,可以是红(red)或者黑(black)。通过任何一条从"根到叶子的简单路径"上的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是近似于平衡的。红黑树是一种平衡二叉树。 红黑树的基本性质 (1)每个结点要么是红色的,要么是黑色的(废话..) (2)根结点是黑色的 (3)叶子结点是黑色的(也可...

Alfeim的博客 400

HMC5883L磁力计在STM32F4上的I2C驱动与数据校准实战

本文详细介绍了HMC5883L磁力计在STM32F4平台上的I2C驱动开发与数据校准实战。通过解析寄存器配置、数据读取处理和椭圆拟合校准算法,帮助开发者实现精准的地磁测量,特别适用于无人机导航和机器人系统中的航向确定与陀螺仪漂移修正。

2y3u4i5o6p的博客 1037

Cursor 详细使用

Cursor 是一款基于 VSCode 开发的 AI 驱动代码编辑器,集成 GPT-4、Claude3.5 等先进 LLM,具备代码补全、生成、解释、调试等功能,可提升开发效率和代码质量。3. 代码编辑:在编辑区编写代码,利用快捷键提升效率,如 Ctrl+Space 触发智能代码补全、Ctrl+K 润色或修改代码、Ctrl+L 智能问答与代码编辑。3. 代码解释:选中代码,按 Ctrl+L,输入如 “解释这段代码的功能”,Cursor 会给出详细解释。

坚持写博客,大家的关注是我前进的动力! 4815
上一篇: 算法导论笔记 红黑树(2)
下一篇: stl源码剖析 详细学习笔记 RB_tree (1)
boydfd
博客等级 码龄16年 101粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值