爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      关联式数据结构_红黑树剖析 #C++

      首页 知识中心 软件开发 文章详情页

      关联式数据结构_红黑树剖析 #C++

      2024-10-21 09:46:02 阅读次数:28

      红黑树,节点,迭代

      红黑树的性质和定义

      红黑树的性质

      红黑树是一种平衡搜索二叉树。红黑树的每个节点存储了一个标记颜色的变量(红色或黑色),通过对任意一条从根到叶子结点的路径中节点着色方式的限制,使树的最长路径不超过最短路径的两倍,因而红黑树处于一种近似平衡的状态。与AVL树相比,红黑的平衡条件更宽松,旋转的次数更少,因此在频繁插入删除的情况下,红黑树的性能比AVL树好。

      关联式数据结构_红黑树剖析 #C++

      红黑树具有以下性质:

      1. 根(_root)节点是黑色的;
      2. 每个节点不是黑色就是红色;
      3. 如果一个节点是红色的,那么它的两个孩子结点和父亲节点一定是黑结点。即不存在两个连续的红节点;
      4. 从每个节点到其所有叶子结点(nil节点)的路径中,黑色节点的数目相等;
      5. 每个叶子结点(nil)都是黑色的。

      在红黑树中,叶子结点指的往往是空节点,逻辑上用nil进行标识,即认为空节点的颜色是黑色的。

      根据上面的几条性质,可以得知在一棵红黑树中,从某个节点出发的最短路径中一定全部都是黑色节点,而最长路径一定是一黑一红相间(性质c),再加上性质 d 的限制,可以证明红黑树的最长路径一定不超过最短路径的2倍。

      红黑树的节点定义

      为了便于找到节点的父节点,红黑树使用三叉链的形式设计,每个节点存储了有效数据、左右孩子指针和父节点指针,除此之外,红黑树的节点还记录了颜色信息。

      将节点的颜色初始化为红色,是为了在插入新节点后尽量保持红黑树的性质,这点将会在讨论插入操作时说明。

      //用枚举记录颜色信息
      enum Color
      {
        RED,
        BLACK
      };
      
      template<typename T>
      struct RB_tree_node
      {
        typedef RB_tree_node<T> node;
      
        T _data; //数据信息
        node* _left;
        node* _right;
        node* _parent;
        Color _color; //颜色信息
      
        RB_tree_node(const T& data)
          :_data(data),
        _left(nullptr), _right(nullptr),
        _parent(nullptr),
        _color(RED) //将节点的颜色初始化为红色,是为了在插入新节点后尽量保持红黑树的性质
        { }
      };

      红黑树的定义

      红黑树的结构定义与二叉搜索树类似。

      /*为了同时兼容Key模型和Key-Value模型,设计红黑树时提供三个模板参数。
      当T为pair<>类型时,红黑树存储的数据为Key-Value模型,
      Key和KeyOfT仿函数针对Key-Value模型,
      便于使用和拿取pair<>中的Key*/
      template<typename Key, typename T, typename KeyOfT>
      class RB_tree
      {
      private:
        typedef RB_tree_node<T> node;
        
        /*…………*/
        
      private:
        node* _root;
      };

      KeyOfT是一个仿函数,针对Key模型或Key-Value模型分别拿取有效数据的Key值。

      //针对Key模型(set)
      struct SetKeyOfT
      {
        const Key& operator()(const Key& key)
        {
          return key;
        }
      };
      //针对Key-Value模型(map)
      struct MapKeyOfT
      {
        //接受一个K-V键值对,返回kv.first
        const Key& operator()(const std::pair<const Key, Value>& kv)
        {
          return kv.first;
        }
      };

      红黑树的构造和析构

      构造红黑树时,将_root初始化为nullptr,析构时进行后序递归遍历析构。

      template<typename Key, typename T, typename KeyOfT>
      class RB_tree
      {
      private:
          typedef RB_tree_node<T> node;
      
      public:
          RB_tree()
              :_root(nullptr)
              { }
      
          /*…………*/
          
          ~RB_tree()
          {
              _destroy(_root);
          }
      
      private:
          
          /*…………*/
          //后序遍历析构
          void _destroy(node* root)
          {
              if (root == nullptr) {
                  return;
              }
      
              _destroy(root->_left);
              _destroy(root->_right);
              delete root;
              root = nullptr;
          }
          
          /*…………*/
      
      private:
          node* _root;
      };

      红黑树的迭代器

      涉及红黑树的迭代器时,需要考虑迭代器类型、前进和后退、解引用和成员访问操作。

      红黑树的迭代器属于双向迭代器,不具备随机定位能力,与list类似。为了满足迭代器的使用需求,需要对节点指针进行封装。由于这里实现的红黑树没有头结点,所以简单以nullptr作为end迭代器。

      //与list的迭代器类似,Ref与Ptr模板参数用来区分普通迭代器和const迭代器
      template<typename T, typename Ref, typename Ptr>
      class __RB_tree_iterator
      {
      private:
        typedef RB_tree_node<T> node;
        typedef __RB_tree_iterator<T, Ref, Ptr> Self;
      
      public:
        __RB_tree_iterator(node* pnode)
          :_node(pnode)
          { }
      
        /*…………*/
      
        node* _node; //对节点指针进行封装
      };
      
      template<typename Key, typename T, typename KeyOfT>
      class RB_tree
      {
      private:
        typedef RB_tree_node<T> node;
      
      public:
        typedef __RB_tree_iterator<T, T&, T*> iterator;
        typedef __RB_tree_iterator<T, const T&, const T*> const_iterator;
      
      public:
        RB_tree()
          :_root(nullptr)
          { }
      
        //begin迭代器指向树中的最小节点,即最左节点
        iterator begin()
        {
          node* leftMost = _root;
          while (leftMost && leftMost->_left) {
            leftMost = leftMost->_left;
          }
          return leftMost;
        }
      
        const_iterator begin() const
        {
          node* leftMost = _root;
          while (leftMost && leftMost->_left) {
            leftMost = leftMost->_left;
          }
          return leftMost;
        }
      	//简单以nullptr作为end迭代器
        iterator end()
        {
          return nullptr;
        }
      
        const_iterator end() const
        {
          return nullptr;
        }
        /*…………*/

      迭代器的解引用和元素访问接口直接返树节点的有效数据即可。

      Ref operator*() const
      {
        return _node->_data;
      }
      
      Ptr operator->() const
      {
        return &(_node->_data);
      }

      红黑树迭代器的前进操作其实走的是一个非递归中序遍历二叉树的过程,以迭代器遍历红黑树,得到的是一个升序序列。在前进的过程中,根据中序遍历顺序 “左子树 根 右子树” 分情况对节点指针进行调整即可。

      Self& operator++()
      {
        node* cur = _node; //将当前节点视为“根”,优先向右子树走
        node* parent = cur->_parent;
      
        //当前节点的右子树不为空,寻找右子树的最小节点(最左节点)
        if (cur->_right)
        {
          node* subLeft = cur->_right;
          while (subLeft->_left) {
            subLeft = subLeft->_left;
          }
          _node = subLeft;
        }
        else //右子树为空,说明所在子树的左子树、根、右子树都被走完,向上层的根走
        {
          while (parent)
          {
            //此时cur处于parent的左子树,parent为“上层的根”,即_node的下一个位置
            if (cur == parent->_left) {
              break;
            }
            else //继续寻找上层的根
            {
              cur = cur->_parent;
              parent = parent->_parent;
            }
          }
          _node = parent; //当parent最终为空时,说明整棵树被走完,返回nullptr作为end迭代器
        }
        return *this;
      }

      红黑树的后退操作走的是中序遍历的逆过程,即“右子树 根 左子树”,其他细节与前进操作类似。

      Self& operator--()
      {
        node* cur = _node; //视当前节点为根,向左子树寻找
        node* parent = cur->_parent;
        if (cur->_left) //左子树不为空
        {
          //向左寻找最大的节点(最右节点)
          node* subRight = cur->_left;
          while (subRight->_right) {
            subRight = subRight->_right;
          }
          _node = subRight;
        }
        else //左子树为空,说明当前子树的右子树、根、左子树都被走完,向上层的根走
        {
          while (parent && cur == parent->_left)
          {
            //cur为parent的右子树,将_node直接调整为parent即可
            if (cur == parent->_right) {
              break;
            }
            else
            {
              cur = cur->_parent;
              parent = parent->_parent;
            }
          }
          _node = parent;
        }
        return *this;
      }

      比较迭代器时只需要比较对应的_node即可。

      bool operator==(const Self& it) const
      {
        return _node == it._node;
      }
      
      bool operator!=(const Self& it) const
      {
        return _node != it._node;
      }

      红黑树的元素操作

      元素查找

      查找元素时,以Key按照二叉搜索树的性质查找即可。

      /*…………*/
      iterator find(const Key& k) const
      {
        node* cur = _root;
        KeyOfT kot; //实例化出一个仿函数对象
        //按照二叉搜索树的性质进行遍历查找
        while (cur)
        {
          if (k < kot(cur->_data)) {
            cur = cur->_left;
          }
          else if (k > kot(cur->_data)) {
            cur = cur->_right;
          }
          else {
            return cur;
          }
        }
        return nullptr;
      }
      /*…………*/

      插入操作

      红黑树的插入操作分为两步:插入新节点,判断和调整平衡。插入新节点的过程与二叉搜索树的插入过程相同,按照二叉搜索树的性质找到合适的插入位置并插入即可。当插入节点后,如果树节点的着色情况破坏了红黑树的性质,则需要对树进行调整。

      由性质d,如果插入的新节点的颜色是黑色,那么插入后,从根节点到该新节点的黑色节点数量就比其他路径多 1,使整个红黑树被破坏,所以为了在插入后尽量保持红黑树的性质,将新节点的颜色设置为红色。

      std::pair<iterator, bool> insert(const T& data)
      {
        node* newNode = new node(data);
        if (_root == nullptr)
        {
          _root = newNode;
          _root->_color = BLACK;
          return std::make_pair(_root, true);
        }
        KeyOfT kot;
        node* cur = _root;
        node* parent = nullptr;
        //寻找合适的插入位置
        while (cur)
        {
          if ((kot(data)) < (kot((cur->_data))))
          {
            parent = cur;
            cur = cur->_left;
          }
          else if ((kot(data)) > (kot((cur->_data))))
          {
            parent = cur;
            cur = cur->_right;
          }
          else {
            return std::make_pair(cur, false);
          }
        }
        //进行比较和节点链接
        if (kot(data) < kot(parent->_data)) {
          parent->_left = newNode;
        }
        else {
          parent->_right = newNode;
        }
        newNode->_parent = parent;
        
        /*…………*/

      红黑树的平衡调整

      将新的红色节点插入到树中之后,如果新节点的父亲为红色,则需要对树进行调整。为了方便描述,假设新节点(当前调整的节点)为C,新节点的父亲节点为P,祖父节点为G,叔叔节点为U,下面大体分两种情况自下而上对树进行调整。

      • U节点存在(不为空)且为红色。将 P 和 U 置为黑色,同时为了保证路径中黑色节点数目相等,将G置为红色。此时以G为根的子树已是一颗红黑树,继续向上判断和调整,不结束。

      关联式数据结构_红黑树剖析 #C++

      • U节点存在且为黑色,或者U不存在(为空)。此时需要以G为根对树进行旋转和变色,具体分为以下几种情况:
      • P为G的左,且C为P的左,此时进行右单旋;

      关联式数据结构_红黑树剖析 #C++

      • P为G的左,且C为P的右,此时进行右双旋;

      关联式数据结构_红黑树剖析 #C++

      • P为G的右,且C为P的右,此时进行左单旋;
      • P为G的右,且C为P的左,此时进行左双旋

      完成旋转后,需要对树进行颜色调整,调整原则为,将旋转后的新根置为黑色,将新根的两个孩子节点置为红色,结束。

      /*…………*/
      
      //调整平衡
      cur = newNode;
      parent = cur->_parent;
      while (parent && parent->_color == RED)
      {
        node* grandFather = parent->_parent;
        if (parent == grandFather->_left)
        {
          node* uncle = grandFather->_right;
          //U存在且为红色
          if (uncle && uncle->_color == RED)
          {
            parent->_color = uncle->_color = BLACK;
            grandFather->_color = RED;
            //继续向上检查调整,直到parent的颜色为红色
            cur = grandFather;
            parent = cur->_parent;
          }
          else //uncle存在且为黑 或者 uncle不存在
          {
            if (cur == parent->_left)
            {
              RotateRight(grandFather); //右单旋
              parent->_color = BLACK; //颜色调整
              grandFather->_color = RED;
            }
            else if (cur == parent->_right)
            {
              //右双旋
              RotateLeft(parent);
              RotateRight(grandFather);
              cur->_color = BLACK;
              grandFather->_color = RED;
            }
            else {
              assert(false);
            }
            break; //旋转后结束,停止调整
          }
        }
        else //parent == grandFather->_right
        {
          node* uncle = grandFather->_left;
          //U存在且为红色
          if (uncle && uncle->_color == RED)
          {
            parent->_color = uncle->_color = BLACK;
            grandFather->_color = RED;
            //继续向上调整
            cur = grandFather;
            parent = cur->_parent;
          }
          else //U存在且为黑色 或者 U不存在
          {
            if (cur == parent->_right)
            {
              RotateLeft(grandFather); //左单旋
              parent->_color = BLACK; //颜色调整
              grandFather->_color = RED;
            }
            else if (cur == parent->_left)
            {
              //左双旋
              RotateRight(parent); 
              RotateLeft(grandFather);
              cur->_color = BLACK;
              grandFather->_color = RED;
            }
            else {
              assert(false);
            }
            break; //旋转后结束判断
          }
        }
      }
      _root->_color = BLACK; //保持_root的颜色为黑色
      
      /*…………*/

      红黑树的合法性检验

      为了方便测试,这里给出一个检验红黑树是否合法的接口,根据红黑树的性质对树进行检查。

      /*…………*/  
      
      	bool is_RB_tree() const
        {
          //_root是黑色的
          //一个红色节点的父亲和两个孩子一定是黑色节点
          //从任意节点开始的路径中黑色节点数量相等
          if (_root->_color == RED) {
            return false; //检查根节点的颜色
          }
      
          node* cur = _root;
          int controlValue = 0;
          //以最左路径中的黑色节点数量作为基准值,检查其他路径中的黑色节点数目
          //是否与该基准值相等
          while (cur)
          {
            if (cur->_color == BLACK) {
              ++controlValue;
            }
            cur = cur->_left;
          }
          int blackNum = 0;
          //递归检查树的着色情况
          return _is_RB_tree(_root, controlValue, blackNum);
        }
      
      private:
        bool _is_RB_tree(node* root, int controlValue, int blackNum)
        {
          //认为空树平衡
          if (root == nullptr) {
            return true;
          }
      		//存在两个连续的红色节点,false
          if (root->_color == RED && root->_parent->_color == RED) {
            return false;
          }
      		//黑色节点数量 +1
          if (root->_color == BLACK) {
            ++blackNum;
          }
      		//判断该条路径中的黑色节点数量
          if (root->_left == nullptr && root->_right == nullptr && blackNum != controlValue) {
            return false;
          }
      		//递归判断左右子树
          return _is_RB_tree(root->_left, controlValue, blackNum) && 
            _is_RB_tree(root->_right, controlValue, blackNum);
        }
      
      	/*…………*/
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/158SHI/7524374,作者:158SHI,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:C++泛型和模板_part1

      下一篇:Linux线程控制

      相关文章

      2025-05-19 09:04:44

      spark控制台没显示其他机器

      spark控制台没显示其他机器

      2025-05-19 09:04:44
      Spark , 节点 , 集群
      2025-05-19 09:04:14

      二叉树经典OJ练习

      二叉树经典OJ练习

      2025-05-19 09:04:14
      root , 二叉树 , 子树 , 节点 , 遍历
      2025-05-14 10:33:31

      计算机小白的成长历程——习题演练(函数篇)

      计算机小白的成长历程——习题演练(函数篇)

      2025-05-14 10:33:31
      函数 , 字符串 , 数组 , 知识点 , 编写 , 迭代 , 递归
      2025-05-14 10:33:16

      30天拿下Rust之切片

      在Rust中,切片是一种非常重要的引用类型。它允许你安全地引用一段连续内存中的数据,而不需要拥有这些数据的所有权。切片不包含分配的内存空间,它仅仅是一个指向数据开始位置和长度的数据结构。

      2025-05-14 10:33:16
      amp , end , 切片 , 字符串 , 引用 , 索引 , 迭代
      2025-05-14 10:33:16

      30天拿下Rust之向量

      在Rust语言中,向量(Vector)是一种动态数组类型,可以存储相同类型的元素,并且可以在运行时改变大小。向量是Rust标准库中的一部分,位于std::vec模块中。

      2025-05-14 10:33:16
      Rust , 使用 , 元素 , 向量 , 方法 , 索引 , 迭代
      2025-05-14 10:07:38

      30天拿下Python之迭代器和生成器

      在Python中,迭代器是一个非常重要的概念,它使得我们能够遍历一个序列而无需使用索引。迭代器不仅限于列表、元组、字符串等,我们也可以创建自定义的迭代器对象。

      2025-05-14 10:07:38
      Python , 使用 , 函数 , 生成器 , 返回 , 迭代 , 遍历
      2025-05-14 10:03:13

      【MySQL】-数据库优化(索引)

      索引(index)是帮助数据库高效获取数据的数据结构

      2025-05-14 10:03:13
      index , Tree , 二叉 , 搜索 , 数据 , 索引 , 节点
      2025-05-14 10:02:48

      MongoDB常用管理命令(1)

      MongoDB常用管理命令(1)

      2025-05-14 10:02:48
      会话 , 命令 , 操作 , 节点
      2025-05-14 09:51:15

      java实现管线拓扑关系连通性分析

      管线拓扑关系的连通性分析通常涉及图论(Graph Theory)中的概念,特别是无向图(Undirected Graph)的遍历算法,如深度优先搜索(DFS, Depth-First Search)或广度优先搜索(BFS, Breadth-First Search)。

      2025-05-14 09:51:15
      BFS , DFS , 复杂度 , 搜索 , 节点 , 访问 , 遍历
      2025-05-14 09:51:15

      python 判断for循环最后一次

      在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态(比如当前是第几次迭代)。但是,我们可以使用一些技巧来间接地实现这个需求。

      2025-05-14 09:51:15
      len , 对象 , 循环 , 迭代
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5228827

      查看更多

      最新文章

      30天拿下Rust之向量

      2025-05-14 10:33:16

      30天拿下Python之迭代器和生成器

      2025-05-14 10:07:38

      二叉搜索树中第K小的元素

      2025-05-13 09:50:17

      用go语言,现有一棵无向、无根的树,树中有 n 个节点,按从 0 到 n - 1 编号 给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges

      2025-05-13 09:49:12

      代码 测试用例 测试结果 测试结果 两两交换链表中的节点

      2025-05-09 09:30:19

      DS进阶:并查集

      2025-05-09 08:50:35

      查看更多

      热门文章

      Python编程:pkgutil获取包里面的所有模块列表

      2023-03-16 07:45:06

      Python编程:iterator迭代器

      2023-02-15 08:39:14

      走读源码探究HashMap的树化时机以及红黑树的操作机制

      2023-03-02 10:21:34

      jquery-节点操作

      2023-06-13 08:29:18

      Python 装饰&生成&迭代器

      2023-06-16 06:06:37

      【C++】RBTree——红黑树

      2023-07-26 08:09:37

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      C++数据结构——红黑树

      Python算法学习[4]—树、二叉树、霍夫曼树&算法实现

      【C++图论】2359. 找到离给定两个节点最近的节点|1714

      红黑树精通指南:面试、实战与源码分析

      python中循环结构:两种类型:for 循环和 while 循环用法

      Python 中迭代器与生成器:深度解析与实用指南

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号