news 2026/4/15 22:21:03

手把手实现红黑树Set和Map

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手实现红黑树Set和Map

好的,我们来手把手实现一个简化版的红黑树(RB-Tree),并基于此封装SetMap容器。整个过程会分为几个步骤:


步骤1: 红黑树基础

红黑树是一种自平衡二叉搜索树,满足以下性质:

  1. 每个节点是红色或黑色
  2. 根节点是黑色
  3. 叶子节点(NIL节点)是黑色
  4. 红色节点的子节点必须是黑色(不能有连续红色节点)
  5. 从任一节点到其叶子节点的路径包含相同数量的黑色节点

步骤2: 节点结构设计

enum Color { RED, BLACK }; template<typename T> struct RBTreeNode { T data; // 节点存储的数据 Color color; RBTreeNode* parent; RBTreeNode* left; RBTreeNode* right; RBTreeNode(T val, Color c = RED) : data(val), color(c), parent(nullptr), left(nullptr), right(nullptr) {} };

http://my.tv.sohu.com/us/441548290/698245990.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NTk5MC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247253.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzI1My5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247332.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzMzMi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247513.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzUxMy5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247336.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzMzNi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247340.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzM0MC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247343.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzM0My5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247424.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzQyNC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247349.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzM0OS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247351.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzM1MS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247534.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzUzNC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247537.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzUzNy5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247286.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzI4Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247443.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzQ0My5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247451.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzQ1MS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247454.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzQ1NC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247557.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzU1Ny5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247567.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzU2Ny5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247608.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzYwOC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247387.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzM4Ny5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247624.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzYyNC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247593.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzU5My5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247486.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzQ4Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247600.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzYwMC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247646.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzY0Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247916.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzkxNi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247921.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzkyMS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247500.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzUwMC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247929.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzkyOS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247931.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzkzMS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247736.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzczNi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247992.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0Nzk5Mi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247997.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0Nzk5Ny5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248025.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODAyNS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248105.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODEwNS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248216.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODIxNi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248234.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODIzNC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248316.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODMxNi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248068.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODA2OC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248246.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODI0Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248254.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODI1NC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248333.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODMzMy5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248085.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODA4NS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248262.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODI2Mi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248164.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODE2NC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248339.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODMzOS5zaHRtbA==.html


步骤3: 核心操作实现

3.1 左旋(Left Rotate)
template<typename T> void RBTree<T>::leftRotate(RBTreeNode<T>* x) { RBTreeNode<T>* y = x->right; x->right = y->left; if (y->left) y->left->parent = x; y->parent = x->parent; if (!x->parent) root = y; else if (x == x->parent->left) x->parent->left = y; else x->parent->right = y; y->left = x; x->parent = y; }
3.2 右旋(Right Rotate)
template<typename T> void RBTree<T>::rightRotate(RBTreeNode<T>* y) { RBTreeNode<T>* x = y->left; y->left = x->right; if (x->right) x->right->parent = y; x->parent = y->parent; if (!y->parent) root = x; else if (y == y->parent->left) y->parent->left = x; else y->parent->right = x; x->right = y; y->parent = x; }

http://my.tv.sohu.com/us/441548290/698245990.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NTk5MC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247253.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzI1My5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247332.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzMzMi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247513.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzUxMy5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247336.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzMzNi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247340.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzM0MC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247343.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzM0My5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247424.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzQyNC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247349.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzM0OS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247351.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzM1MS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247534.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzUzNC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247537.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzUzNy5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247286.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzI4Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247443.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzQ0My5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247451.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzQ1MS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247454.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzQ1NC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247557.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzU1Ny5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247567.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzU2Ny5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247608.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzYwOC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247387.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzM4Ny5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247624.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzYyNC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247593.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzU5My5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247486.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzQ4Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247600.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzYwMC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247646.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzY0Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247916.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzkxNi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247921.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzkyMS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247500.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzUwMC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247929.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzkyOS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247931.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzkzMS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247736.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0NzczNi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247992.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0Nzk5Mi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698247997.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0Nzk5Ny5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248025.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODAyNS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248105.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODEwNS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248216.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODIxNi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248234.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODIzNC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248316.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODMxNi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248068.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODA2OC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248246.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODI0Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248254.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODI1NC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248333.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODMzMy5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248085.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODA4NS5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248262.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODI2Mi5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248164.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODE2NC5zaHRtbA==.html
http://my.tv.sohu.com/us/441548290/698248339.shtml
https://tv.sohu.com/v/dXMvNDQxNTQ4MjkwLzY5ODI0ODMzOS5zaHRtbA==.html


步骤4: 插入修复(Fixup)

插入后可能破坏红黑树性质,需通过颜色翻转和旋转修复:

template<typename T> void RBTree<T>::insertFixup(RBTreeNode<T>* z) { while (z->parent && z->parent->color == RED) { if (z->parent == z->parent->parent->left) { RBTreeNode<T>* uncle = z->parent->parent->right; if (uncle && uncle->color == RED) { // Case 1: 叔节点为红 z->parent->color = BLACK; uncle->color = BLACK; z->parent->parent->color = RED; z = z->parent->parent; } else { if (z == z->parent->right) { // Case 2: 三角型 z = z->parent; leftRotate(z); } // Case 3: 直线型 z->parent->color = BLACK; z->parent->parent->color = RED; rightRotate(z->parent->parent); } } else { // 对称操作(略) } } root->color = BLACK; // 根节点始终为黑 }

步骤5: 封装Set容器

template<typename Key> class Set { private: RBTree<Key> tree; // 红黑树实例 public: void insert(const Key& key) { tree.insert(key); } bool contains(const Key& key) { return tree.find(key) != nullptr; } // 迭代器、删除等操作(略) };

步骤6: 封装Map容器

通过存储键值对实现:

template<typename Key, typename Value> class Map { private: struct MapNode { Key key; Value value; bool operator<(const MapNode& other) const { return key < other.key; } }; RBTree<MapNode> tree; // 存储键值对 public: void insert(const Key& key, const Value& val) { tree.insert({key, val}); } Value& operator[](const Key& key) { auto node = tree.find({key, Value()}); if (!node) { insert(key, Value()); node = tree.find({key, Value()}); } return node->data.value; } };

总结

  1. 红黑树核心:旋转 + 颜色修复
  2. Set封装:直接存储单一类型数据
  3. Map封装:存储键值对,通过自定义比较规则排序

完整实现需补充删除操作、迭代器、边界检查等细节,但以上框架已覆盖核心逻辑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 17:20:43

<span class=“js_title_inner“>.NET 主流 ORM 功能介绍 大全 最新</span>

.NET主流ORM下面是3款.NET 使用最多的ORM&#xff0c;来自公众号投票结果 &#xff0c;数据比较真实可靠测试项目发布时间微信公众号投票使用难度功能性能SqlSugar orm201426% 491票适中全中高EFCore orm201636% 663票较难全中高Dapper orm201323% 374票简单少高一、SqlSuga…

作者头像 李华
网站建设 2026/4/15 19:54:47

<span class=“js_title_inner“>支配树算法原理及鸿蒙工具实践</span>

本文介绍了支配树&#xff08;Dominator Tree&#xff09;算法在鸿蒙系统 ArkTS 内存分析工具中的应用。为应对淘宝 App 鸿蒙版因内存溢出导致的 Crash 问题&#xff0c;作者构建了一套从客户端采集内存快照、服务端自动分析的工具链。文中对比了多种支配树构建算法&#xff08…

作者头像 李华
网站建设 2026/4/14 18:00:07

Cybersecurity AI (CAI) AI 时代的网络安全自动化框架

您好&#xff01;很高兴为您详细介绍 Cybersecurity AI (CAI) 这个项目。 根据您提供的资料&#xff0c;这是一个非常专业且前沿的网络安全开源项目。以下是对 CAI 的全面介绍和解读&#xff1a; Cybersecurity AI (CAI) 一、核心定位&#xff1a;AI 时代的网络安全自动化框…

作者头像 李华
网站建设 2026/3/27 11:13:01

【工具】Python解释器和PyCharm的安装与使用

一、Python 解释器的安装 windows系统下载链接&#xff0c;现在主流用 python3&#xff0c;小版本号随便选&#xff1a;Python Releases for Windows | Python.orghttps://www.python.org/downloads/windows/环境变量加上&#xff0c;选自定义换个安装路径&#xff1a; 安装成…

作者头像 李华