C++之红黑树插入+查找功能实例(二百六十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:C++之红黑树插入+查找实例

2.红黑树介绍

  • 红黑树是一种自平衡二叉查找树,它能够保持树的平衡,从而确保查找、插入和删除操作的最坏情况时间复杂度为O(log n)。红黑树通过约束节点的颜色和规则来保持平衡,这些规则包括:
  1. 每个节点非红即黑。
  2. 根节点是黑色的。
  3. 所有叶子节点(NIL节点)是黑色的。
  4. 若一个节点是红色的,则它的子节点都是黑色的。
  5. 从任意节点到其每个叶子节点的所有路径都包含相同数量的黑色节点。
    红黑树的作用主要体现在以下几个方面:
  6. 维持树的平衡:红黑树通过自动调整节点颜色和旋转操作,确保树的高度大约为log(n),从而保证查找、插入和删除操作的高效性。
  7. 提高查找效率:由于红黑树保持平衡,因此查找操作的时间复杂度为O(log n),这使得红黑树在数据查找场景中具有很高的效率。
  8. 插入和删除操作:红黑树在插入和删除节点时,会通过旋转和变色操作来保持树的平衡,从而保证插入和删除操作的时间复杂度也为O(log n)。
  9. 应用广泛:红黑树作为一种高效的数据结构,被广泛应用于各种场景,如C++ STL中的map、set、multimap、multiset等容器,以及Linux内核中的调度器、内存管理等模块。
    红黑树的用法如下:
  10. 查找操作:红黑树的查找操作与二叉查找树相同,从根节点开始,如果查找的值小于当前节点,则递归查找左子树;如果查找的值大于当前节点,则递归查找右子树;如果查找的值等于当前节点,则返回当前节点。
  11. 插入操作:插入操作分为以下几个步骤:
    a. 执行二叉查找树的插入操作,将新节点插入到合适的位置。
    b. 将新插入的节点设置为红色。
    c. 通过旋转和变色操作来修正红黑树,保持树的平衡。
  12. 删除操作:删除操作分为以下几个步骤:
    a. 找到待删除节点的后继节点(中序遍历的后一个节点)。
    b. 将后继节点的值复制到待删除节点,并将待删除节点设置为后继节点。
    c. 删除后继节点,此时待删除节点的值已经被替换为后继节点的值。
    d. 通过旋转和变色操作来修正红黑树,保持树的平衡。
  • 总之,红黑树是一种高效的自平衡二叉查找树,通过约束节点颜色和规则来保持树的平衡,从而保证查找、插入和删除操作的高效性。红黑树广泛应用于各种场景,如C++ STL中的容器和Linux内核中的调度器、内存管理等模块。

3.代码实例

<1>.红黑树插入+查询功能

#include <iostream>// 枚举类型,表示节点的颜色
enum Color { RED, BLACK };// 节点结构体
template <typename T>
struct Node {T data; // 节点存储的数据Node<T> *left, *right, *parent; // 左子节点指针、右子节点指针、父节点指针Color color; // 节点的颜色// 构造函数Node(T data) : data(data), left(nullptr), right(nullptr), parent(nullptr), color(RED) {}
};// 红黑树类
template <typename T>
class RedBlackTree {
private:Node<T>* root; // 根节点指针
public:// 构造函数RedBlackTree() : root(nullptr) {}// 插入操作函数void insert(T data);// 搜索操作函数bool search(T data);
};// 插入操作实现
template <typename T>
void RedBlackTree<T>::insert(T data) {// 创建新节点Node<T>* newNode = new Node<T>(data);// 如果根节点为空,直接将新节点设为根节点,颜色为黑色if (root == nullptr) {root = newNode;root->color = BLACK;return;}// 否则,找到新节点的插入位置Node<T>* parent = nullptr;Node<T>* current = root;while (current != nullptr) {parent = current;if (newNode->data < current->data)current = current->left;elsecurrent = current->right;}// 将新节点插入到树中newNode->parent = parent;if (newNode->data < parent->data)parent->left = newNode;elseparent->right = newNode;
}// 搜索操作实现
template <typename T>
bool RedBlackTree<T>::search(T data) {Node<T>* current = root;while (current != nullptr) {if (data == current->data)return true;else if (data < current->data)current = current->left;elsecurrent = current->right;}return false;
}int main() {// 创建红黑树对象RedBlackTree<int> tree;// 向树中插入一些元素tree.insert(10);tree.insert(20);// 搜索并输出结果std::cout << "Searching for 10: " << (tree.search(10) ? "Found" : "Not found") << std::endl;std::cout << "Searching for 25: " << (tree.search(25) ? "Found" : "Not found") << std::endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SeaTunnel 与 DataX 、Sqoop、Flume、Flink CDC 对比

产品概述 Apache SeaTunnel 是一个非常易用的超高性能分布式数据集成产品&#xff0c;支持海量数据的离线及实时同步。每天可稳定高效同步万亿级数据&#xff0c;已应用于数百家企业生产&#xff0c;也是首个由国人主导贡献到 Apache 基金会的数据集成顶级项目。 SeaTunnel 主…

当代深度学习模型介绍--循环神经网络(RNNs)

AI大模型学习 方向一&#xff1a;AI大模型学习的理论基础 模型和应用的多样化&#xff1a;随着研究的深入&#xff0c;深度学习领域出现了多种创新的模型架构&#xff1a; 卷积神经网络&#xff08;CNNs&#xff09;专门针对图像处理任务进行了优化&#xff0c;通过模拟生物视…

『Apisix系列』破局传统架构:探索新一代微服务体系下的API管理新范式与最佳实践

文章目录 『Apisix基石篇』『Apisix入门篇』『Apisix进阶篇』『Apisix安全篇』 『Apisix基石篇』 &#x1f680; 手把手教你从零部署APISIX高性能API网关 利用Docker-compose快速部署Apache APISIX及其依赖组件&#xff0c;实现高效的API网关搭建通过编写RPM安装脚本来自动化安…

IDEA MyBatisCodeHelper Pro最新版(持续更新)

目录 0. 你想要的0.1 包下载0.2 使用jh 1. 功能介绍2. 下载安装2.1 在idea中插件市场安装2.2 在jetbrains插件市场下载安装 3. 简单使用3.1 创建一个SpringBoot项目3.2 配置数据库3.3 一键生成实体类、mapper 0. 你想要的 0.1 包下载 测试系统&#xff1a;Windows&#xff08…

ERP与MES系统深度对接详细解决方案

此方案适合绝大部分生产型企业&#xff0c;企业如果有用到ERP&#xff0c;MES&#xff0c;WMS等其他系统的。可以借鉴以下的对接方案。 在ERP与MES系统对接的具体内容中&#xff0c;物料管理、出入库信息、物料清单&#xff08;BOM&#xff09;、生产计划、生产领料、生产用料的…

【吊打面试官系列】Redis篇 -Redis 回收进程如何工作的?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis 回收进程如何工作的&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; ​Redis 回收进程如何工作的&#xff1f; 一个客户端运行了新的命令&#xff0c;添加了新的数据。Redi 检查内存使用情况&#xff0c;如 果…

浅析AI大模型当前存在的技术瓶颈和限制及解决方案

方向五&#xff1a;未来发展趋势与挑战 提示&#xff1a;展望AI大模型学习的未来发展趋势&#xff0c;并讨论当前面临的主要挑战。可以关注新技术、新方法的出现&#xff0c;以及它们对AI大模型学习的影响&#xff1b;同时&#xff0c;也可以分析当前存在的技术瓶颈和限制&…

P2802 回家

P2802 回家 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 虽然是普及-难度的题&#xff0c;但是感觉细节有很多。 细节&#xff1a; bfs第一次到 ( i , j ) (i, j) (i,j)&#xff0c;但是距离不一定是最小的 鼠标是一次性物品 血量到达 ( x x , y y ) (xx, yy) (xx,yy)为…

【文献分享】 机器学习 + 分子动力学 + 第一性原理计算 + 热力学性质(熔化温度 热导率 热膨胀系数)

分享一篇关于机器学习 分子动力学 第一性原理 熔化温度&#xff08;熔化温度 & 热导率 & 热膨胀系数&#xff09;的文章。 感谢论文的原作者&#xff01; 关键词&#xff1a; 1. Al−Li alloy 2. Neural network potential 3. Molecular dynamics 4. Thermal pr…

wireshark 使用

wireshark介绍 wireshak可以抓取经过主机网卡的所有数据包&#xff08;包括虚拟机使用的虚拟网卡的数据包&#xff09;。 环境安装 安装wireshark: https://blog.csdn.net/Eoning/article/details/132141665 安装网络助手工具&#xff1a;https://soft.3dmgame.com/down/213…

源支付V7开源版2.99,修复各种提示错误

源支付V7开源版2.99&#xff0c;修复各种提示错误 加密说明&#xff1a;200拿来的&#xff0c;只有8.1这个文件加密&#xff0c;其他文件无任何加密&#xff0c;已修复各种提示错误 测试其他开源版安装提示错误&#xff0c;有几个文件是加密的 注&#xff1a;开发不易&#…

AJAX(二):axios 和 fetch函数发送AJAX请求、同源策略、 jsonp、CORS

一、各种发送AJAX请求 jquery基于回调函数&#xff0c;axios基于promise 1.axios发送AJAX请求!!! axios (v1.5.0) - Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 Node.js 中。 | BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 服务器&#xff1a; app.…

Redis类型 Stream Bitfield

Stream 类型 Stream类型就是Redis里的mq,是redis为了占领市场份额的产物 今天我们就来介绍一下Stream Redis的消息队列一般是两个方案 第一个是Lpush Rpop 队列的异步队列方案(一对一) 第二个方案就是pubsub(发布订阅)模式 (一对多) 注:这里如果没有消费者了,队列中的数据就直…

代码随想录第25天 | 组合总和||| 、 电话号码的字母组合

一、前言 参考文献&#xff1a;代码随想录 今天的还是回溯算法&#xff0c;主要用到了昨天的回溯组合方法和巧妙思路方法&#xff0c;让我们继续为算法打基础吧&#xff01; 二、组合总和||| 1、思路&#xff1a; 这一题和昨日的组合没啥太大区别只是遍历的范围变为了固定…

未来智慧停车:技术架构解析与创新应用

随着城市化进程的不断加速&#xff0c;停车难题已成为城市居民生活中的一大痛点。传统的停车方式已经无法满足日益增长的停车需求&#xff0c;而智慧停车系统则成为了解决这一难题的重要途径。本文将深入探讨智慧停车系统的技术架构&#xff0c;并探索其在城市管理和用户体验上…

echarts双柱状堆叠图

效果 代码 option {tooltip: {trigger: axis,axisPointer: { // 坐标轴指示器&#xff0c;坐标轴触发有效type: shadow // 默认为直线&#xff0c;可选为&#xff1a;line | shadow},formatter: function (params) { var res<div><p>时间&am…

数据库聚簇索引和非聚簇索引的区别

聚簇索引&#xff08;Clustered Index&#xff09;和非聚簇索引&#xff08;Non-clustered Index&#xff09;是数据库中两种不同的索引类型&#xff0c;它们的主要区别在于数据的存储方式和索引的结构&#xff1a; 数据存储方式&#xff1a; 聚簇索引&#xff1a;索引的叶子节…

ssm框架笔记-maven

html是骨头 css使皮肤 js是你能做的动作 MAVEN 依赖管理&#xff1a;1.声明dependenciys标签 2.maven search3。 版本号提取 3.$引用 3.2依赖传递和冲突 依赖传递指的是当一个模块或库 A 依赖于另一个模块或库 B&#xff0c;而 B 又依赖于模块或库 C&#xff0c;那么 A 会间…

vue3+vite模版框架 tabs右键刷新时丢失路由参数

问题&#xff1a; 标题栏的tabs的右键&#xff1a;刷新时&#xff0c;没有保存上一个页面传递过来的参数 分析&#xff1a; TagView.vue刷新事件 function refreshSelectedTag(view: TagView) {console.log(|--执行刷新, view)tagsViewStore.delCachedView(view);const {full…

吴恩达2022机器学习专项课程(一) 4.1 梯度下降

问题预览 梯度下降算法的作用是&#xff1f;梯度下降的过程&#xff1f;梯度下降和最小化成本函数的联系&#xff1f;所有的成本函数都是一个形状吗&#xff1f;在非凸形状中&#xff0c;梯度下降的更新过程是&#xff1f;在非凸形状中&#xff0c;不同的初值对最小化成本函数…