红黑树(二)插入

uniapp 记录运动轨迹 开发_智能手环穿戴设备APP开发解决方案 智能手环是一种穿戴式智能设备,是目前备受关注的科技产品。目前智能手环具有的功能有记录日常生活中的运动数据、移动轨迹,定位等,有些还可以进行睡眠质量的检测,并将这些数据传送至移动端如手机、平板等,可对数据进行分析,指导健康生活的作用。而智能手环开发方案就是将这些功能实现,将算法烧录到主控板上。智能手环都有哪些功能  1、记录运动数据  对于喜欢健身的用户来说,智能手环记录的运动数据功能... 阅读详情

 接下来介绍红黑树的插入操作,介绍插入之前,我们先来了解一下红黑树的性质。

  1、每个节点不是红色就是黑色

  2、跟节点为黑色。

  3、如果节点为红,子节点必须为黑。

  4、任意节点至树尾端的任何路径,黑节点必须相同。

  

规则4主要是保证树的平衡性,不过它的要求不是很严。主要是为了减少调整操作。根据规则4,我们可以判断出新节点都是红节点。(如果新节点是黑节点,那么每次插入都要进行调整)

由于要经常使用某个节点的父亲。所以这里添加了一个指向父亲的指针。所以我们先看一下红黑树的结构组成。

复制代码
typedef int value_type;
typedef bool color_type;
const color_type red = true;
const color_type black = false;

typedef struct node
{
    value_type value;
    color_type color;

    struct node * parent;
    struct node * left;
    struct node * right;
} Node;

typedef struct Tree
{
    Node * root;
} Tree;
复制代码

Node节点,value,关键字信息。color,颜色。parent,left,right,父亲,左孩子,右孩子。

Tree只有一个根节点。

插入操作,与二叉树的插入是一样的。

首先是找到插入位置。

复制代码
//根节点返回NULL,找到返回当前节点,否则返回x的父亲(x是节点所在的位置)
static Node * search_node(const int key, Tree * tree)
{
    Node * x, * y;

    x = tree->root;
    y = nil;

    while ( x != nil )
    {
        y = x;
        if ( key < x->value )
            x = x->left;
        else if ( key >  x->value )
            x = x->right;
        else
            break;
    }

    return y;
}
复制代码

nil是一个空节点,所有应该为空的指针都指向它。这个节点是黑色的,parent,left,right都为NULL,没有初始化value。(不是一定要有nil节点)

其次将元素插入

复制代码
void rb_insert(const value_type value, Tree * tree)
{
    Node * new_node;//新节点
    Node * x = search_node(value, tree);//插入点
    
    if ( x == nil )
    {
        tree->root = make_new(value);
        tree->root->color = black;//根节点为黑色
    }
    else
    {
        if ( x->value == value )//关键字不可重复
            return;

        new_node = make_new(value);
        if ( value < x->value )//将新节点插入二叉树中
            x->left = new_node;
        else
            x->right = new_node;
        new_node->parent = x;//设置新节点的父亲

        if ( x->color == red )//如果新节点的父亲为红色,调整
            insert_fixup(new_node, tree);
    }
}
复制代码

新节点一定是红色的,所以不会违反规则4,但有可能违反规则3。也就是说如果插入节点的父亲是红色的,那么违反了规则3。

我们需要进行调整。

调整时会遇到三种情况,根据不同的情况进行不同的调整。

调整是一个循环过程,当x为根节点或者x是黑色时结束。(这个操作次数并不会很多)

三种情况在代码中看注释。

复制代码
static void insert_fixup(Node * x, Tree * tree)
{
    Node * y;//y是x的伯父节点
    while ( x != tree->root && x->parent->color == red )
    {
        if ( x->parent == x->parent->parent->left )//父亲是祖父左孩子
        {
            y = x->parent->parent->right;

            //case 1:    伯父是红色
            //处理办法
            //        1.将父亲,伯父变成黑色
            //        2.将祖父变成红色
            //        3.将祖父设为x,向上检查
            if ( y->color == red )
            {
                x->parent->color = black;
                y->color = black;
                x->parent->parent->color = red;
                x = x->parent->parent;
            }
            else
            {
                //case 2:    x是父亲的右孩子
                //处理办法:
                //        1.将x设为x的父亲
                //        2.以x为旋转点,左旋
                //经过上述操作,转换成case 3
                if ( x == x->parent->right )
                {
                    x = x->parent;
                    left_rotate(x, tree);
                }
                
                //case 3:    x是父亲的左孩子
                //处理办法:
                //        1.将x的父亲设为黑色
                //        2.将x的祖父设为红色
                //        3.以x的祖父为旋转点,右旋
                x->parent->color = black;
                x->parent->parent->color = red;
                right_rotate(x->parent->parent, tree);
            }
        }
        else//与上述处理相同,只是将left与right互换
        {
            y = x->parent->parent->left;

            if ( y->color == red )
            {
                x->parent->color = black;
                y->color = black;
                x->parent->parent->color = red;
                x = x->parent->parent;
            }
            else
            {
                if ( x == x->parent->left )
                {
                    x = x->parent;
                    right_rotate(x, tree);
                }

                x->parent->color = black;
                x->parent->parent->color = red;
                left_rotate(x->parent->parent, tree);
            }
        }
    }//while end

    tree->root->color = black;
}
复制代码

这样插入操作就完成了。

这是一棵红黑树,圆圈里的代表黑色节点,没有圆圈的代表红色。大家可以利用这棵树来调代码。建议在调整时,用printf把case 1到3标记一下,挨个试验。

这颗树的插入顺序是10,7,8,15,5,6,11,13,12。

YOLOv11涨点改进| SCI一区2026 |独家创新首发、特征融合改进篇|引入FAFM特征对齐融合模块,通过特征对齐和融合两个阶段,助力多模态融合小目标检测,小目标检测,SAR图像目标检测高效涨点 🔥本文提出了一种改进YOLOv11网络模型的方法,通过引入FAFM(特征对齐融合模块)来解决多模态目标检测中的特征空间错位问题。FAFM模块采用可变形卷积和内容引导注意力机制,有效实现了跨模态特征对齐与融合,充分利用了不同模态间的互补信息。该方法在保持模型轻量化的同时,显著提升了目标检测精度和鲁棒性,特别是在复杂背景和模态差异较大的场景下表现突出。文章详细介绍了FAFM模块的结构、原理、优势,并提供了完整的代码实现和模型配置方案,为多模态目标检测任务提供了实用的技术参考。 阅读详情

相关推荐

数学建模:相关性分析学习——皮尔逊(pearson)相关系数与斯皮尔曼(spearman)相关系数

相关性分析:求解相关系数并绘制热力图进行对比

weixin_67565775的博客 8万+

红黑树详解(二)红黑树的插入(附动图和案例)

红黑树详解(二)红黑树的插入(附动图和案例) 摘要:     在很多源码涉及到大量数据处理的时候,通常都是用红黑树这一数据结构。红黑树是一种自平衡的二叉查找树,它能在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,获得较高的查找性能。本文将使用图文详细的分析红黑树的插入 ​ 回顾一下红黑树的五条性质 1.节点不是红色就...

程序猿练习生 3004

小样本物体检测

Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector 关键:提出了一个小样本数据集:数据集 步骤: 提取support img为一过滤特征 使用support img的特征来过滤query img,最后将过滤后的特征输入RPN网络中 RPN网络层的输出,会进行多头判断,使用全局信息检测,使用局部信息检测,一对多检测 Attention-Based Region Proposal Network Increme

qq_21157073的博客 5266

详解红黑树之插入操作

逻辑: 1.插入节点必为红(黑就会打破每一条路径黑节点个数相同的规定) 2.若无root,直接变成root,颜色变黑 3.通过BST遍历找到插入节点的father 4.进入while循环(将当前插入节点的grandfather以下节点群视为一个整体) 5.若father是黑,直接结束,满足要求 6.若father是红,两个红连在一起,进一步判断uncle 7.若uncle为黑或null,首先将LR或RL转成LL或RR,再对LL或RR进行旋转得到平衡,并染色 8.若uncle是红,直接对uncle fat..

小楼一夜听春雨 742

合宙ESP32C3实战:MPU6500六轴传感器数据读取与校准全解析

本文详细解析了如何使用合宙ESP32C3开发板读取和校准MPU6500六轴姿态传感器数据。从硬件接线、开发环境搭建到核心代码解析,提供了全面的实战指南,帮助开发者快速掌握传感器配置与数据处理技巧,适用于姿态控制、运动检测等应用场景。

weixin_27066963的博客 405

论文理解【LLM-Clarification】—— 【QDrawer】Asking the Right Question at the Right Time: Human and Model Unce

本文基于 CoDraw 任务对 LLM 澄清提问的触发方式进行探索,发现模型内部不确定性与人类澄清决策相关性弱,使用不确定性阈值触发澄清提问相比模仿人类提问时机,性能和计算效率都更好

佚失的诗篇 770

算法导论习题练习——红黑树的插入和删除

题目13.3-2 将关键字 41、38、31、12、19、8 连续地插入一棵初始化为空的红黑树之后,试画出该结果树。 Solution: 13.4-3 在练习13.3-2中,我们将关键字41,38,31,12,19,8连续插入一棵初始为空的树中,从而得到一棵红黑树。请给出从该树中连续删除关键字8,12,19,31,38,41后的结果。 Solution: 首先,节点关键字为8的节点为红色

Lavi的专栏 1万+

别再只测电压了!用STM32G474的ADC玩点花的:过采样提升精度与多通道扫描实战

本文深入探讨了STM32G474系列单片机的ADC高级应用,包括硬件过采样技术实现16位精度和多通道扫描结合DMA的自动数据采集方案。通过详细的配置步骤和实战案例,帮助开发者突破传统电压测量局限,提升信号采集精度和系统效率,适用于工业监控、医疗设备等高精度应用场景。

weixin_42647395的博客 238

插入相同“键值”key时Linux 内核中红黑树的使用

Linux 内核中提供了一个通用红黑树的实现(位于文件rbtree.h和rbtree.c),在日常的项目开发中,很多人也是直接将其代码取出来,然后自己“包装”一下就使用了。    近期的使用中我有了一个这样的疑问,就是如果插入相同的key,是不是这个红黑树还能正常使用?这样做会不会破坏这个红黑树的结构?当然我们知道C++ STL中的 multimap(multimap也是基于red-black

认真做事,乐观做人。 5307

LibTV保姆级教程:从提示词到AI视频成片全流程

AI视频生成技术正以前所未有的速度重塑内容创作行业,过去需要编剧、摄影、剪辑等多角色协作的复杂流程,如今借助AI绘画与图生视频等核心能力,一个人也能完成高质量短视频制作。理解提示词工程是掌控AI视频创作的关键,通过精准描述主体、环境、光线与运镜,可以显著提升生成画面的稳定性与专业度。而图生视频技术则让静态分镜自然流动,有效解决角色一致性与场景漂移等常见问题。这类工具已广泛应用于产品宣传、剧情短片、社交媒体内容生产等场景,大幅降低了视频创作门槛。本文以LibTV一站式AI视频创作平台为例,从核心概念到完整实操

weixin_29046035的博客 953

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。还原数据库时把序列取消勾选,选择不还原序列。因为还原表的同时,会自动将自增序列还原上去,此处勾选会导致数据库重复创建序列。点击还原数据库完毕后,可以看到序列仅有一个,没有出现重复序列。但此时的序列当前值是从1开始的,需要重置。点击菜单“其它”-》“序列”,可以看到有多个重复序列。

奋斗鱼 1043

红黑树详解二:红黑树的插入

系列文章目录 文章目录系列文章目录1、红黑树的定义2、插入3、总结4、完整例子 1、红黑树的定义   1、节点是红色或黑色   2、根节点是黑色   3、不能有两个连续的红色节点(但是可以有两个连续的黑色节点)   4、从任一节点到其每个叶子节点路径经过的黑色节点个数相同。 性质3和4共同决定了:**最长路径的节点总数量不会超过最短路径的两倍。**因为黑色节点数量要一样,红色不能连着来,从而路径全黑时最短,红黑交替时最长。比如4个黑色节点,最短:黑-黑-黑-黑(4),最长:黑-红-黑-红-黑-红-黑(7)。

zhengguofeng0328的博客 992

基于 FPGA 的 CNN 卷积神经网络之池化层 Verilog 实现

池化层是卷积神经网络(CNN)中的关键组件,用于降低特征图的维度,减少计算量和防止过拟合。常见的池化操作包括最大池化和平均池化。FPGA 提供了高效的并行处理能力,可以加速这些操作。池化层在 CNN 中扮演重要角色,通过降低数据维度提升计算效率。在 FPGA 上实现池化层,可以充分利用硬件资源实现高效的并行计算,有助于提高实时应用中的推理速度。

走向CTO的路上... 1256

红黑树系列二:红黑树的插入

一、树的旋转 因为红黑树的插入

lpp0900320123的专栏 1516

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

红黑树(二)红黑树的插入操作

红黑树的插入用二叉搜索树的插入操作实现,先把红黑树看作一个普通的二叉搜索树,然后插入一个结点insertNode,并且将insertNode着为红色(如果将insertNode着为黑色,则必定会导致某些路径上的黑结点数目不同,要调整这个不同需要耗费比较多的时间),插入之后,我们再对红黑树进行一定的调整,以保持它的红黑性质。为了方便观察,我们先列出插入结点insertNode之后的树的可能情况图:如上

love_jing_forever的博客 556

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

红黑树理解(二) 插入过程图解

插入的节点是根节点 直接插入,标记为黑色。 插入的节点的父节点是黑色  例如:原红黑树中,只有根节点,根节点本来就是黑色,这是再次插入新节点,新节点的父节点就是黑色。  直接插入,标记为红色。 插入的节点的父节点是红色,叔叔节点也是红色 直接,将父亲节点和叔叔节点都改为黑色,新节点任然保持红色。 插入的节点的父节点是红色,叔叔节点是黑色 4.1 左左插入 4.2 左右插入 4.3 右右插入 4.4 右左插入 红黑树的原理 (插入+ 删除) 案例分析 ...

知道这个有什么用? 1046

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

红黑树(二):旋转和插入

红黑树(二):旋转和插入

主要研究图形学相关领域 477

红黑树(二)----插入的情况

详解红黑树插入的情况

m0_73537205的博客 1043

红黑树的插入与删除(二)

上文回溯 在上一篇插入节点分析中已经提过,红黑树的插入节点相对于AVL树来讲,需要的调节平衡的操作比较少,一方面表示红黑树的平衡定义与AVL树不同,另一方面也说明了红黑树不是严格意义上的平衡树,即查询操作不是严格的O(log n)。不过带来的好处则是需要的调节操作少,在插入、删除节点时具有较少的性能消耗,也就是所谓的统计性能较好。 回顾一下红黑树的五个特性: 1.节点颜色为红或者

蚂蚁的博客 579

【算法】红黑树插入数据(变色,左旋、右旋)(二)

本人菜鸡一只,正在更新红黑树系列的文章。 该系列已经全部更完,有5篇文章:   【算法】红黑树(二叉树)概念与查询(一):https://blog.youkuaiyun.com/lsr40/article/details/85230703 【算法】红黑树插入数据(变色,左旋、右旋)(二):https://blog.youkuaiyun.com/lsr40/article/details/85245027 【算法...

lsr40的博客 1万+

红黑树基础与代码 - 节点的插入(二)

一. 节点的插入 节点的插入会破坏红黑树结构,所以我们要做变色和旋转操作,节点的变色和旋转是为了修正被破坏的红黑树, 使其符合红黑树的规则,从新达到平衡状态。红黑树的节点插入与二叉查找树的插入的过程是一样的,只是最后多了一步平衡调整操作,插入到红色节点下时才需要调整,因为插入到红色节点下违反了两个红色节点不能相邻规则。 二. 插入规则 插入节点平衡调整的几种情况如下: 情况一:新插入节点的父节...

WQ_631288233的博客 248

红黑树的删除_红黑树插入、删除、实现与可视化(二)

红黑树的删除代码实现见GitHub​github.com红黑树插入见(一)mathnull:红黑树插入、删除、实现与绘制(一)​zhuanlan.zhihu.com直观上,按非空孩子节点的数量分,可以将要删除的节点分为三种情况:2个孩子节点,1个孩子节点,没有孩子节点。如果删除节点没有孩子,例如要删除上图的节点7,那么可以直接将其删除。如果删除节点只有1个孩子,例如要删除上图的节点37,由于节点3...

weixin_39550410的博客 128

数据结构之红黑树(二)——插入操作

插入或删除操作,都有可能改变红黑树的平衡性,利用颜色变化与旋转这两大法宝就可应对所有情况,将不平衡的红黑树变为平衡的红黑树。 在进行颜色变化或旋转的时候,往往要涉及祖孙三代节点:X表示操作的基准节点,P代表X的父节点,G代表X的父节点的父节点。 我们先来大体预览一下插入的过程: 1、沿着树查找插入点,如果查找过程中发现某个黑色节点的两个子节点都是红色,则执行一次颜色变换(父节点变

SuYuMingXiangGuan的博客 597

红黑树-RBT(二、基本操作之插入)

一、红黑树插入节点   1、时间复杂度:向一颗含有n个节点的红黑树中插入一个新节点的操作可在O(lgn)时间内完成。   2、步骤     1)、将节点z插入树T内,就好像T是一颗普通的二叉查找树一样,然后将z着为红色。     2)、为保证红黑性质可以得到保持,调用一个辅助程序RB-INSERT-FIXUP   3、RB-Insert伪代码 1 RB-INSERT(T, z) ...

weixin_30413739的博客 188
上一篇: 红黑树(一)旋转
下一篇: 红黑树(三)删除
! 不再维护
博客等级 码龄11年 63粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值