算法-树(2)—深入红黑树

贝叶斯网络框架 前言: 文章主要的目的是介绍eBay所使用的一个贝叶斯网络的框架,博主通过阅读相关论文和源代码以及代码测试,慢慢熟悉了该框架的使用方法及主要思想。 本文将尽量的阐述清楚贝叶斯网络的解决过程,如果你还不知道贝叶斯网络是解决哪一类问题的,请查看:贝叶斯网络笔记。 如果你能通过阅读论文熟悉贝叶斯网络,请尽量阅读论文,因为论文里一般都有详细的解释和公式化的证明过程。而本文的重点并不在 阅读详情

本篇文章主要介绍2-3树,并由2-3树重点介绍RB树(红黑树)
后附完整代码

2-3树

1. 2-3树
2-3树概念:
一颗2-3查找树,或为空树,或为由2-结点,3-结点构成的树。
2-结点:含有一个键值对和两个链接,左链接的结点均小于该结点,右链接的结点均大于该结点。
3-结点:含有两个键值对和三个链接,左链接的结点小于该节点的小的键值,中链接介于该结点的两个键值之间,右链接大于改结点的大的键值。
2. 2-3树的查找添加
1).查找:
参照上一篇文章,实现较为简单,即比较需要查找的key值和x.left,x.right比较,递归实现。
2).添加:
添加首先需要查找添加到的正确位置;
然后主要两类(其他都可以由这两个变换出):
一:添加到空结点—直接添加,或者向2-结点添加(2-结点变为3-结点实现);
二:向3-结点的树增加新键值,1.创建一个4-结点,2.将4-结点分解为两个2-结点树;
<如向一个父结点为3-结点的3-结点添加新键值,同样先变为4-结点,再递归往上变为3-结点,若递归到跟结点仍为4-结点,则直接分解根结点>

红黑树

红黑树背后的基本思想是用标准的二叉查找树(完全由2-结点构成),和一些额外的信息(红链接表示3-结点,黑链接表示2-3树的普通链接)。

在阅读本文前,要摆脱的思想是,红链接并非是一个2-结点所有的,一个红链接,它是两个2-结点构成的。
红链接含义

因此下文所说到的红链接,其实就是两个2-结点,一个3-结点,其实也就是一个红链接,而并非Node结构中多出Mid引用!
(而4-结点呢?自然就是两个红色链接了)

1.红黑树定义
其中,其满足以下三个含有红黑链的二叉查找树:
1>红链接均为左链接;
2>没有任何一个结点是同时由两个红链接组成;
3>该树是完美黑色平衡(即:任意空链接到根结点路径上的黑链接数目相同)。

红黑树的添加

红黑树和2-3树?
如图:
这里写图片描述
是不是很有关系了。

为什么会有红黑树的旋转操作?为什么会有左右旋转和颜色转换?
因为必须保证树是完美黑色平衡的。
所以在涉及红黑树的操作,如增加时:
我们必须保证刚刚增加的结点的链接颜色是红色的。(这样递归增加这样的结点时候,树就是红黑树了)
假如我们刚刚增加的结点是大于根结点的,这个时候就需要用到左旋转了。
而右旋转则是因为存在两条连续的红色左链接,所以这时候需要右旋转后再左旋转。

红黑树的旋转
正是因为有了两个变换过程,所以保证了红黑树的前两个定义。
而第三个颜色转换,使得对于红黑树来说,红链接更少,而黑链接更多,从而大大提高效率。(因为增加删除都是对于红链接操作的,这就是红黑树效率高于AVL树的原因之一)

1).左旋转
存在右边链接为红色的结点。
实现如下:

    private Node rotateLeft(Node h)
    {
        Node x = h.right;
        h.right = x.left;
        x.left = h;
        x.color = h.color;
        h.color = RED;
        x.N = h.N;
        h.N = size(h.left) + size(h.right)+1;
        return x;
    }

2).右旋转
存在两条连续的左链接为红色。
如:x.left = RED && x.left.left = RED;
实现:

    private Node rotateRight(Node h)
    {
        Node x = h.left;
        h.left = x.right;
        x.right = h;
        x.color = h.color;
        h.color = RED;
        x.N = h.N;
        h.N = size(h.left) + size(h.right)+1;
        return x;
    }

3).颜色转换

    // flip the colors of a node and its two children
    private void flipColors(Node h) {
        // h must have opposite color of its two children
        // assert (h != null) && (h.left != null) && (h.right != null);
        // assert (!isRed(h) &&  isRed(h.left) &&  isRed(h.right))
        //    || (isRed(h)  && !isRed(h.left) && !isRed(h.right));
        h.color = !h.color;
        h.left.color = !h.left.color;
        h.right.color = !h.right.color;
    }

以下是三个变换过程:
三个变换过程

添加操作put实现:

    private Node put(Node h, Key key, Value val)
     { 
        //Recursive comparison the node insertion location
        //添加的结点,显然是要设置为红色
        if (h == null) 
            return new Node(key, val, 1, RED);

        int cmp = key.compareTo(h.key);
        if      (cmp < 0) 
            h.left  = put(h.left,  key, val); 
        else if (cmp > 0) 
            h.right = put(h.right, key, val); 
        else             
            h.val   = val;

        //每一次递归增加元素,都需要修复红黑树,以保证三个定义.
        // fix-up any right-leaning links
        if (isRed(h.right) && !isRed(h.left))     
            h = rotateLeft(h);
        if (isRed(h.left)  &&  isRed(h.left.left)) 
            h = rotateRight(h);
        if (isRed(h.left)  &&  isRed(h.right))    
            flipColors(h);
        h.N = size(h.left) + size(h.right) + 1;

        return h;
    }

如下图过程:
put操作

红黑树删除

删除操作时,我们必须保证删除的不是2-结点,因为2-结点删除后形成一个空链接,从而破坏了红黑树的第三个定义。

1. 2-3-4树的插入算法
<此算法实现沿路径既能向上也能向下进行变换的操作>
分为两部分:
1>向下变换
保证当前结点不是4-结点,当遇到父结点为2-结点的4-结点,将4-结点分为两个2-结点,并且将中间键值传给父结点(父结点变为3-结点); 当遇到父结点为3-结点的4-结点,同样将上一操作(此时父结点变为4-结点——用向上变换摊平)。
2>向上变换
将之前创建的4-结点配平(分解为三个2-结点,高度增加1)。
此算法在红黑树上的实现:
1>将4-结点分解为三个2-结点子树,用红链接连接起来;
2>向下过程(递归过程)将所有4-结点进行颜色转换;
3>向上过程,分解旋转分解所有4-结点(配平)。
2. 删除最小键
由红黑树的第三个定义可以知道,删除键时,假如删除的是2-结点,会形成一个空链接,从而导致第三个定义不符合。因此,删除红黑树键时,当前结点必须是3-结点(即:只能在红链接中删除)。
完成以上要求的,必须满足一下情况之一:
1>假如当前结点不是2-结点;
2>当前结点的左子结点是2-结点,而当前结点的兄弟结点不是2-结点,此时需要借一个结点进行删除操作;
3>如果当前结点的左结点和它的亲兄弟结点都是2-结点,则将左子结点,父结点中的最小键和左子结点最近的兄弟结点合并为一个4-结点,使得父结点由3-结点变为2-结点或者由4-结点变为3-结点。
(如下图的第四个变换)
三个过程如下图:
删除变换过程
实现如下:

    public void deleteMin()
    {
        if(!isRed(root.left) && !isRed(root.right))
            root.color = RED;
        root = deleteMin(root);
        if(!isEmpty())
            root.color = BLACK;
    }

    private Node deleteMin(Node h)
    {
        //最开始递归由上至下是吧,即由树根到叶子的过程
        if(h.left == null)
        //可能有人会疑问,为什么递归结束条件不是h == null.
        //因为是不存在h,和h.right的这样两个结点的子树.
            return null;
        /**
         * 既然知道了h.left==null,
         * 是不是这个时候我们就要看一下h这个结点是不是3-结点或者是4-结点呢,
         * 因为前面已经说过,我们的删除操作是必须要在非2-结点中进行
         */
        if(!isRed(h.left) && !isRed(h.left.left))
            h = moveRedLeft(h);  
        h.left = deleteMin(h.left);
        //下面这个balance自然就是向上使用旋转配平啦
        return balance(h);
    }

其中moveRedLeft如下:

    private Node moveRedLeft(Node h)
    {
        /**filpColors?为什么呢?
          *因为我们不是要构造3-结点或者4-结点的吗
          *而此时我们也不要忘了,递归是由上至下的
          *所以filpColors构造依次构造临时4-结点罢了
          */
        flipColors(h);
        /**
         * 别忘了deleteMin的if判断语句
         * 它只是判断了h.left && h.left.left两个结点false(null也是false)
         * 所以呢,最小值可能存在于h的右子树当中吧
         * 因此呢,对于右子树,我们也是要配4-结点的
         */
        if(isRed(h.right.left))
        {
            h.right = rotateRight(h.right);
            h = rotateLeft(h);
        }
        return h;
    }

再贴一个moveRedRight(删除最大值或者任意值用到)

    private Node moveRedRight(Node h)
    {
        flipColors(h);
        if(!isRed(h.left.left))
            h = rotateRight(h);
        return h;
    }

其中banlance函数(删除后,修复红黑树)实现如下:

    /**
     * balance函数,相对于put操作的配平,是不是有点差异呢
     * 其实都是可以的,差异只是:put操作的配平的第一个if判断,仅会将3-结点配平
     * 而在这里的if,3-结点和4-结点都在第一个if进行首先配平了
     * @param h
     * @return
     */
    private Node balance(Node h)
    {
        if(isRed(h.right))
            h = rotateLeft(h);
        if(isRed(h.left) && isRed(h.left.left))
            h = rotateRight(h);
        if(isRed(h.left) && isRed(h.right))
            flipColors(h);

        h.N = size(h.left)+size(h.right)+1;
        return h;   
    }
删除最大值当然就类似,下面直接讨论删除任意值。

3. 删除任意键
只要领悟了删除最小值,删除任意值,也就不难了。
与删除最小键值类似,必须确保删除的结点不是2-结点。
1>当删除节点是位于底部时,可以直接删除;不是底部,则和上一篇文章,删除二叉搜索树的结点类似。
2>假如不在底部,删除后我们显然要在它的子树中找到最小值进行替换
3>问题就变成了在一颗根结点不是2-结点的子树中删除最小值了。
4>删除后,仍需使用回溯并分解剩余的4-结点。
实现:

 public void delete(Key key) { 
        if (get(key) == null)  //需要删除的键值存不存在呢?
            return;
        if (!isRed(root.left) && !isRed(root.right))
            root.color = RED;
        root = delete(root, key);
        if (!isEmpty()) root.color = BLACK;
    }
    private Node delete(Node h, Key key) { 
        if (key.compareTo(h.key) < 0)  {
            //和删除最小值类似
            if (!isRed(h.left) && !isRed(h.left.left))
                h = moveRedLeft(h);
            h.left = delete(h.left, key);
        }
        else {
            //咦?左子树有一个红链接?那右子树是不是肯定比左子树高度少1了(不可能左右都是红链接)
            //deleye(h.right,key)?那不行了,这样左右子树肯定不是黑色平衡了
            if (isRed(h.left))
                h = rotateRight(h);
                //根结点就可以直接删除了
            if (key.compareTo(h.key) == 0 && (h.right == null))
                return null;
                //
            if (!isRed(h.right) && !isRed(h.right.left))
                h = moveRedRight(h);
                //这个就是非根结点的删除了
            if (key.compareTo(h.key) == 0) {
                Node x = min(h.right);
                h.key = x.key;
                h.val = x.val;
                h.right = deleteMin(h.right);
            }
            else h.right = delete(h.right, key);
        }
        return balance(h);
    }
参照网站:http://algs4.cs.princeton.edu/30searching/

算法第四版

算法之平衡查找树:从2-3树到红黑树的进阶之路 在编程的学习旅程中,算法就如同闪耀的灯塔,指引我们高效地解决各类复杂问题。我在探索算法的过程中,收获了知识与乐趣,同时也遇到了不少挑战。深刻体会到独自钻研时的困惑,所以希望通过这篇博客,能与大家一起深入学习算法知识,在交流和分享中共同进步,让更多人感受到算法的魅力,提升编程能力。 阅读详情

相关推荐

探索树结构与算法的奥秘:从2-3树到红黑树

本文深入探讨了数据结构中的2-3树和红黑树,并解答了为何它们在实际应用中的设计选择。通过一系列问题与答案,揭示了这些高级数据结构背后的设计理念和性能优化。同时,提供了实际操作练习,帮助理解并掌握这些复杂树结构的特性。

weixin_36464343的博客 295

概率图模型-可分解图-连接树算法-弦图-图论

用自已的话整理一下概率图模型里面的一些图理论 读论文的时候先遇到的可分解图,那首先给出分解的定义: 以上定义的1,3条都好理解,那么第2条的理解是,A集合B集中的节点之间的路径一定要通过S集中的节点,用图的条件独立性可以说,在S已知的条件下,A与B条件独立,A与B里面包含的节点是没有之间相连的。 下面再看一下可分解图的概念 总结一下就是一个无向图如果本身是完全图(也就是节点之间都是相互连接的)或者不是完全图但是存在真分解(A,B,S),那么称该无向图是可分解图。下面给两个可分解图的例子 在第一个可分解图

weixin_51290449的博客 2557

从SFF-8087到SFF-8643:详解服务器硬盘背板连接线缆的演变与实战接线

本文深度解析了服务器硬盘背板连接技术从SFF-8087到SFF-8643的演进历程,重点介绍了SAS、SATA和U.2接口的技术特点与实战接线方案。通过对比不同连接器标准的物理特性和电气规范,提供了混合环境下的线缆选择策略和常见故障排查指南,帮助IT专业人员优化存储系统性能与稳定性。

weixin_30603633的博客 279

基于最小生成树的单连接算法

本文介绍基于最小生成树(MST)的单连接聚类算法,分为凝聚和分裂两种,都十分简单。(基于MST的单连接凝聚算法)step 1. 假设有n个待聚类的对象,把每个对象都当做一个独立的簇,画出 这n个点的完全图G(∞)G(\infty),根据G(∞)G(\infty)得到最小生成树,每条边的权重就是对象之间的距离,重复第二步和第三步直到只剩下一个簇。 step 2. 找出MST中权重最小的一条边(如果

tyh70537的博客 2327

【UE5】映射方式:动作映射(Action Mappings) 与 轴映射(Axis Mappings)

链接:https://pan.baidu.com/s/1nQHvZXC4BDsfbFWDYZqEfA?按下键盘A键,不要抬起,屏幕左上角打印了一次。(和Unity中的轴映射机制类似)下面我们通过测试更直观的了解一下这。抬起键盘A键,屏幕左上角打印了一次。项目资源文末百度网盘自取。再添加一个按键,选择键盘。键,缩放值设置为 2.0。,框选所有测试节点,按下。的情况下,屏幕一直打印。

weixin_64072619的博客 3510

STK相关总结

STK简介 一.SIM卡应用工具包(SIM Application Toolkit),又名CAT/USAT,它包含一系列终端与SIM卡的交互指令,SIM卡可以应用卡内的小应用程序和终端交互,从而实现增值服务的目的,STK包括三种类,STK-imsi切换,STK –OTA,STK-BIP 功能: (1) Profile download:配置下载,开机初始化SIM卡过程中,终端告诉SIM卡终端支持哪些功能,STK中download指终端将数据发送给SIM卡 (2) Proactive command: 主动式

jingjing_2的博客 3357

联合树

 转:http://www.jianshu.com/p/f90100680749 Why: 当Graphical model不再是树形结构的时候,factor graph并不能保证有一致的解,我们需要将原本的概率图构造为一种树形结构的图,能够在这种数据结构上执行类似factor tree中的message passing,最终得到我们所感兴趣的分布。 它并没有解决fator tre

BHUER的博客 4630

Synopsys Sentaurus TCAD新手教程:从零开始仿真trench MOSFET(附完整代码解析)

本文提供Synopsys Sentaurus TCAD新手教程,详细讲解从零开始仿真trench MOSFET的全过程,包括环境搭建、外延生长、沟槽刻蚀、栅极形成等关键步骤,并附完整代码解析。通过实际案例帮助半导体工程师掌握Sprocess操作技巧,优化工艺参数设置,提升仿真效率。

weixin_30505225的博客 223

算法面试题-- 连接树的所有兄弟节点

算法面试题-- 连接树的所有兄弟节点

我的英文站点:https://iorilan.medium.com/ 3192

免费测试国外大模型Claude 3.7 Sonnet API:无需api key(秘钥)

Claude 3.7 Sonnet是Anthropic公司推出的第三代Claude系列AI模型中的中规模版本(2024年发布),在性能与效率间实现平衡。该模型基于改进的Transformer架构,支持128K上下文窗口,擅长复杂推理、数学计算和创意写作,在GSM8K数学基准测试中准确率达92%。其采用"宪法AI"伦理框架,通过多轮对抗训练减少有害输出,同时新增多模态理解能力(可解析图片/图表内容)。Claude 3.7 Sonnet是Anthropic推出的高效轻量级大模型,主打快速响应与成本优化。

Explinks的博客 1499

相机图像质量评估标准全解析:MTF、CA、SNR 与色彩偏差的实战理解

图像质量评估是影像系统开发中的核心环节,它直接影响用户视觉体验与终端产品竞争力。本文基于真实的图像调试工程实践,系统讲解主流图像评价指标,包括调制传递函数(MTF)、色差(CA)、信噪比(SNR)与色彩偏差(DeltaE)等关键标准。结合 Imatest 测试流程与实际样张数据,逐项拆解各项指标在实际图像分析中的意义与优化路径,帮助开发者建立完整、量化、工程化的图像质量评估体系。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 2807

红黑树2---从-2-3-4树到红黑树的演变过程以及插入算法实现原理

基本二叉排序树BST,当输入序列有序时,树的高度会急剧增加,最坏情况下时间复杂度为O(N)。 因此进一步演变为2-3-4树,2-3-4树节点类型有3种,2节点,3节点以及4节点,最重要的性质是每个叶子结点到根节点的路径长度一致,其最坏情况下为O(logN)。由于2-3-4树节点类型过大,进行插入以及查找时,需要进行节点类型判断,过于繁琐。 因此利用红连接的概念将2-3-4树转化为红黑树,即红黑...

大魔王 751

用 SAP-ABAP-1 把 ABAP 代码读懂:从 Generative AI Hub Orchestration 到 Joule 落地的实战指南

SAP-ABAP-1 是 SAP 推出的 ABAP 专用基础模型,专注于代码解释与理解。它能显著降低企业遗留系统的维护成本,帮助开发人员快速掌握复杂业务逻辑。该模型通过 SAP Generative AI hub 托管,支持 128,000 tokens 的上下文长度,适合分析大型 ABAP 类和 CDS 视图。典型应用场景包括代码解释、迁移辅助和云合规检查。调用需通过 Orchestration service 进行,确保企业级安全治理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1216

Java数据结构和算法(八)--红黑树与2-3树

红黑树规则:   1、每个节点要么是红色,要么是黑色   2、根节点都是黑色节点   3、每个叶节点是黑色节点   3、每个红色节点的两个子节点都是黑色节点,反之,不做要求,换句话说就是不能有连续两个红色节点   4、从任意节点到所有叶子节点上的黑色节点数量是相同的 一般对红黑树的讲述都是先给出这样的定义,这样想对不太容易理解的,而在算法4一书中,直接跳过这些规则,而讲述了红黑树与2-...

weixin_30338461的博客 168

23 RAG 为什么答不准:召回、分块、排序的常见坑

RAG 答不准时,不要先怪模型。本文把常见失败拆成召回不到、召回不准、分块不完整、排序靠后、上下文污染和生成不忠实六类,并给出从 Top-K 检查到评估集的排查流程。

老于的笔记的专栏 249

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数据结构与算法(java):树-平衡树(2-3树原理,红黑树,B树,B+树)

平衡树 当我们依次往二叉查找树中插入9,8,7,6,5,4,3,2,1这个九个数据时,最终构出来的树是个非平衡树,如下: 当要查找1这个元素时,查找效率会很低,原因在于这个树它不平衡,全部都是向左边的分支。如果让生成的树像完全二叉树那样,查找效率更高。常见的平衡树有如下几个2-3查找树,红黑树,B-树和B+树等。。。 2-3查找树 定义 2-3查找树要么为空要么满足下面两个要求: 2-结点:含有一个键(及其对应的值)和两条链,左链接指向2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。

lalala_dxf的博客 2169

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

数据结构与算法之查找篇:介绍了顺序查找、二分查找、二叉查找树以及平衡查找树(2-3树、红黑树)

概述: 本篇文章主要介绍了查找的主要算法,包括顺序查找、二分查找、二叉查找树以及平衡查找树(2-3树、红黑树)等内容。 ​ 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。 ​ 查找表按照操作方式来分有两大种:静态查找表和动态查找表。 静态查找表(Static Search Table):只作查找操作的查找表。它的主要操作有: ​ (1)查询某个“特定的”数据元素是否在查找表中。 ​ (2)检索某个“特定的”数据元素和各种属性。 ​ 按照我们大

qq_44887733的博客 904

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

红黑树与2-3树

算法导论中的红黑树: 1:每个结点都为红色或者黑色 2:根意结点为黑色 3:每一个叶子结点(最后的空节点)是黑色 4:如果一个意结点为红色,那么它的孩子结点为黑色 5:从任意结点到叶子结点经过的黑结点都一样(对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。) 红黑树:二分搜索树–>特殊机制 2-3树:二分搜索树–>特殊机制 红黑树与2-3树是等价的 2-3树: ...

g_l_xz的博客 298

经典搜索算法之2-3-4树与红黑树

1.2-3-4树     在笔者上篇文章中,介绍了B树和B+树,这里我所说的2-3-4树就是阶为4的B树。根据离散数学的图论相关知识,可以证明2-3-4树和红黑树是等价的。对于m阶(m指的结点的最大分支数)B树,其结点的值的个数n:1&lt;=n&lt;m。因此,对于2-3-4树,其结点的值的个数1&lt;=n&lt;4,如下图所示:                        2.红黑树...

翻过一座座山 1195

MIT算法导论-第10讲-2-3树、红黑树

(本讲内容属于算法第四版,未参照算法导论上的内容)。 平衡查找树之二三树(http://blog.youkuaiyun.com/caipeichao2/article/details/30089151) 平衡查找树的目标是实现查找、插入、删除操作在最坏情况下的复杂度均为logN。 本节将介绍二三查找树。 二三树中有两种节点: 二节点对应一个键,有两个子节点

清文的博客 699

java实现2-3树_Java数据结构和算法(八)--红黑树与2-3树

红黑树规则:1、每个节点要么是红色,要么是黑色2、根节点都是黑色节点3、每个叶节点是黑色节点3、每个红色节点的两个子节点都是黑色节点,反之,不做要求,换句话说就是不能有连续两个红色节点4、从任意节点到所有叶子节点上的黑色节点数量是相同的一般对红黑树的讲述都是先给出这样的定义,这样想对不太容易理解的,而在算法4一书中,直接跳过这些规则,而讲述了红黑树与2-3树的等价性。如果我们先了解2-3树,理解了...

weixin_39767124的博客 436

红黑树的理解与代码实现

红黑树 我们知道对于二叉搜索树而言,无法保证树的平衡性,从而使得进行操作的时候时间复杂度在O(logn)与O(n)之间。这样是不稳定的。而2-3树则借助于3-结点和临时的4-结点,通过分解,解决了平衡问题。例如对于插入,在最终是3-结点的情况下,临时构成4-结点,然后再分解成3个2-结点,这样令树高度+1,但是整体平衡性不变。而红黑树就是为了实现自平衡这个功能而对2-3树进行了扩...

iwts 3144

红黑树和2-3树

目录 什么是红黑树  什么是2-3树  红黑树和2-3树之间的关系 红黑树添加新元素 红黑树实现  红黑树练习  红黑树性能分析   什么是红黑树    什么是2-3树    红黑树和2-3树之间的关系     红黑树添加新元素   红黑树实现 package com.suanfa.RBTree; import java.uti...

百味皆苦的博客 587

动画 | 什么是红黑树?(与2-3-4树等价)

二分搜索树是为了快速查找而生,它是一颗二叉树,每一个节点只有一个元素(值或键值对),左子树所有节点的值均小于父节点的值,右子树所有的值均大于父节点的值,左右子树也是一颗二分搜索树,而且没有键值相等的节点。它的查找、插入和删除的时间复杂度都与树高成比例,期望值是O(log n)。 但是插入数组如[],二分搜索树的缺点就暴露出来了,二分搜索树退化成线性表,查找的时间复杂度达到最坏时间复杂度O...

终极冥帝 195
上一篇: 算法-树(1)—BST(二叉搜索树)
下一篇: 查找算法—散列表
luoz_python
博客等级 码龄10年 57粉丝 47原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值