二叉搜索树-红黑树

2023-11-13

前面介绍了AVL树,虽然AVL树将二叉树的高度差保证在1,但是实现的太过复杂,因为要不断调整平衡因子。故而要来介绍另外一个用途比较广的结构-红黑树。

红黑树

先来看来红黑树的特性:
1、每个节点非红即黑
2、根节点为黑色
3、不能有连续的红节点
4、每条路径上的黑色节点数相等
5、空节点为黑色

先来想一个问题,红黑树的定义保证它最长路径不会超过最短路径的二倍,那么来想想为什么?

这里写图片描述

节点的结构

因为搜索结构在实际运用当中都是采用这种Key,Value模型,所以这里就先这样实现,后面对RBTree进行封装时,会做一些小的调整。

enum COLOUR{RED,BLACK};

template <class K,class V>
struct RBTreeNode
{
    RBTreeNode<K, V>* _left;
    RBTreeNode<K, V>* _right;
    RBTreeNode<K, V>* _parent;//因为要涉及到调平衡,所以定义为三叉链
    K _key;
    V _value;
    COLOUR _colour;//枚举类型的颜色属性,每一个节点非红即黑
};

插入

基本的插入和之前的普通搜索树,AVL树都是一样的,先找到待插入位置,然后进行插入即可,主要的不同就是在动态调整。
至于旋转的过程,红黑树和AVL树都是一样的。
插入时需要注意的是,第四条规则:每条路径上的黑色节点数相等,所以我们可以在初始化节点的时候直接默认是红色的节点,这样就可以避免冲突这条规则。

下面这段代码在实现普通搜索树,AVL树,红黑树都是一样的。

        if (_root == NULL)//先判断空树的场景
        {
            Node* _root = new Node(key, value);
            _root->_colour = BLACK;
            return true;
        }

        Node* cur = _root;
        Node* parent = NULL;
        while (cur)
        {
            if (key < cur->_key)
            {
                parent = cur->_parent;
                cur = cur->_left;
            }
            else if (key > cur->_key)
            {
                parent = cur;
                cur = cur->_right;
            }
            else
            {
                assert(false);
            }
        }
        //走到这里,找到待插入点
        cur = new Node(key, value);
        if (key < cur->_key)
        {
            parent->_left = cur;
            cur->_parent = parent;
        }
        else if (key > cur->_key)
        {
            parent->_right = cur;
            cur->_parent = parent;
        }
        //走到这里说明节点插入进入了,核心的思想就是下面要进行的动态调整

动态调整

下面图示中cur代表当前节点,parent/p代表父节点,uncle/u代表叔叔节点,grandfather/g代表祖父节点。

一共分三种情况:

一:叔叔存在且为红

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉搜索树-红黑树 的相关文章

  • Windows上安装Hadoop 3.x

    目录 0 安装Java 1 安装Hadoop 1 1 下载Hadoop 1 2 下载winutils 2 配置Hadoop 1 hadoop env cmd 2 创建数据目录 3 core site xml 4 hdfs site xml

随机推荐

  • 解决textarea文字不顶头显示/点击textarea 不是第一行

    问题描述 表单提交后发现内容前多了很多空格 而且每次更新表单提交都会有空格增加 后来发现 每次文字从数据库读到textarea后文字都不居左 在排出样式 转义字符等问题后 baidu google了一会始终没找到答案 后来发现原来问题处在H
  • 网络--正向代理和反向代理

    正向代理的概念 正向代理 也就是传说中的代理 他的工作原理就像一个跳板 简单的说 我是一个用户 我访问不了某网站 但是我能访问一个代理服务器 这个代理服务器呢 他能访问那个我不能访问的网站 于是我先连上代理服务器 告诉他我需要那个无法访问网
  • 如何将VS Code扩展插件迁移出系统盘

    背景 Windows的C盘 系统盘 容量经常不够用 经过排查发现VSCode的扩展插件所在目录占用了很大空间 为了节省系统盘的空间 需要将VSCode扩展插件迁移到D盘 环境 Windows VS Code 全称是Visual Studio
  • MySQL的JSON数据类型介绍以及JSON的解析查询

    文章目录 概述 JSON 数据类型的意义 JSON相关函数 测试 创建测试表 插入数据 查询数据 条件查询 优化JSON查询 解决方案 总结 概述 MySQL从5 7后引入了json数据类型以及json函数 可以有效的访问json格式的数据
  • iOS音视频—FFmepg:iOS平台下集成和应用

    1 在iOS平台下集成和应用FFmpeg Mac配置FFmpeg环境 1 安装homebrew ruby e curl fsSL https raw githubusercontent com Homebrew install master
  • Maven中测试插件(surefire)的相关配置及常用方法

    原创文章 版权所有 允许转载 标明出处 http blog csdn net wanghantong 1 在Maven中配置测试插件surefire html view plain copy
  • 通讯录管理系统(C++)

    1 菜单功能 功能描述 用户选择功能的界面 步骤 封装函数showMenu 显示该界面 在main函数中调用封装好的函数 菜单界面 void showMenu cout lt lt 1 添加联系人 lt lt endl cout lt lt
  • \t转义字符占几个字节?

    这个问题 在你学习编程过程中可能会考虑到 有时为了字节对齐而使用转义符中 t 但是到底 t占用几个空格呢 下面我们首先通过程序来体验下 然后在总结 include
  • ElasticSearch(7)---倒排索引

    上一篇 ElasticSearch 6 Kibana插件 1 正向索引和反向索引 涉及到索引的概念的时候 首先需要知道 索引可以分为正向索引和反向索引 也可以理解为倒排索引 正向索引 正向索引可以简单理解为从文档到单词 例如现在有4个文档
  • C库函数之memcpy的实现

    C库函数之memcpy的实现 memcpy的实现方式是当满足四字节对齐时 进行四字节的拷贝 不满足时进行单字节的拷贝 例如拷贝10个字节 循环两次拷贝四字节 在循环两次拷贝一字节 void mem memcpy void dst const
  • h5页面加空格常用的几种方法

    1 html table align center border 1px width 200px tr td 姓名 td td 姓名 td tr tr td 姓 nbsp 名 td td 姓 160 名 td tr tr td 姓 ensp
  • 原深感摄像头与face id实现人脸3D扫描和建模(转)

    原文地址 https tech china com article 20170914 2017091459353 html 就在本月13号 苹果在乔布斯剧院高调地召开了2017秋季新品发布会 本场发布会的最大亮点 也是此前外界最期待的 无疑
  • 正确认识H.264与MPEG-4技术产品

    MPEG4的技术规范如下表所示 H 264视频编解码标准被纳入MPEG 4 Part 10标准中 也就是说它只是附属于MPEG 4的第十部分 换句话说 H 264没有超出MPEG 4标准范畴 因此 网上有关H 264标准和视频传输质量高于M
  • errors and 0 warnings potentially fixable with the `--fix` option.

    vue 项目运行过程中出现 3 errors and 0 warnings potentially fixable with the fix option 的错误 报错问题 原因一 在创建vue项目中 会选择linter Formatter
  • 记一次MQ并发消费导致任务状态异常问题

    背景 项目中有一个短信群发任务 例如1次要发送1W条短信 系统会获取任务中每一条短信的MQ并发发送短信 任务默认状态是未发送 状态码 0 需要在这一批任务发送第一条短信的时候 将任务状态修改为发送中 状态码 1 在任务发送结束将状态修改为发
  • 轻量级卷积神经网络的设计技巧

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 这篇文章将从一个证件检测网络 Retinanet 的轻量化谈起 简洁地介绍 我在实操中使用到的设计原则和idea 并贴出相关的参考资料和成果供读者参考 因此本文是一篇注重
  • networkmanager is not running 网络管理没有运行

    如果确定网卡什么都安装好了 可以下面指令打开 network manager 服务 打开 sudo service network manager start PS network manager 服务 关闭 sudo service ne
  • 基于Linux的人脸识别功能

    前言 需要在翔云平台注册并购买人脸识别服务 通过https协议与个人中心的key和secret 与平台建立连接 说明 使用http协议需要安装libcurl库 而使用https协议需要安装libcurl库选择加入ssl服务 ssl服务依赖于
  • emoji引起的mysql utf-8mb4问题

    场景 在业务中发现备注输入emoji表情后后台系统异常 定位原因发现mysql表不支持此类字符集 mysql版本为5 6 字符集为utf 8 解决 将字符集改为utf 8mb4 报错信息 Incorrect string value xF0
  • 二叉搜索树-红黑树

    前面介绍了AVL树 虽然AVL树将二叉树的高度差保证在1 但是实现的太过复杂 因为要不断调整平衡因子 故而要来介绍另外一个用途比较广的结构 红黑树 红黑树 先来看来红黑树的特性 1 每个节点非红即黑 2 根节点为黑色 3 不能有连续的红节点