高级数据结构03RB树

文章目录

高级数据结构\RB树

1整体结构

2算法示例

3.代码实现

实现红黑树(Red-Black Tree)需要遵循其特定的性质和操作规则。以下是C++实现红黑树的完整代码,包括插入操作和相关的旋转及颜色调整逻辑:红黑树的性质

  1. 每个节点是红色或黑色。
  2. 根节点是黑色。
  3. 所有叶子节点(空节点)是黑色。
  4. 如果一个节点是红色,则它的两个子节点都是黑色(不能有两个连续的红色节点)。
  5. 从任意节点到其每个叶子的所有路径都包含相同数量的黑色节点。
cpp 复制代码
#include <iostream>
using namespace std;

template <typename T>
class RBTree {
public:
    RBTree() : _root(nullptr) {}

    void insert(const T& val) {
        _root = _insert(_root, val);
        _root->_isRed = false; // 根节点必须是黑色
    }

    void inorder() {
        _inorder(_root);
        cout << endl;
    }

private:
    struct RBNode {
        T _data;
        RBNode* _left;
        RBNode* _right;
        bool _isRed; // 红色为true,黑色为false

        RBNode(const T& data) : _data(data), _left(nullptr), _right(nullptr), _isRed(true) {}
    };

    RBNode* _root;

    // 插入辅助函数
    RBNode* _insert(RBNode* node, const T& val) {
        if (node == nullptr) {
            return new RBNode(val);
        }

        if (val < node->_data) {
            node->_left = _insert(node->_left, val);
        } else if (val > node->_data) {
            node->_right = _insert(node->_right, val);
        } else {
            return node; // 不允许插入重复值
        }

        // 修复红黑树的性质
        if (isRed(node->_right) && !isRed(node->_left)) {
            node = rotateLeft(node);
        }
        if (isRed(node->_left) && isRed(node->_left->_left)) {
            node = rotateRight(node);
        }
        if (isRed(node->_left) && isRed(node->_right)) {
            flipColors(node);
        }

        return node;
    }

    // 左旋操作
    RBNode* rotateLeft(RBNode* node) {
        RBNode* x = node->_right;
        node->_right = x->_left;
        x->_left = node;
        x->_isRed = node->_isRed;
        node->_isRed = true;
        return x;
    }

    // 右旋操作
    RBNode* rotateRight(RBNode* node) {
        RBNode* x = node->_left;
        node->_left = x->_right;
        x->_right = node;
        x->_isRed = node->_isRed;
        node->_isRed = true;
        return x;
    }

    // 颜色翻转
    void flipColors(RBNode* node) {
        node->_isRed = true;
        node->_left->_isRed = false;
        node->_right->_isRed = false;
    }

    // 判断节点是否为红色
    bool isRed(RBNode* node) {
        return node != nullptr && node->_isRed;
    }

    // 中序遍历辅助函数
    void _inorder(RBNode* node) {
        if (node == nullptr) {
            return;
        }
        _inorder(node->_left);
        cout << node->_data << " ";
        _inorder(node->_right);
    }
};

int main() {
    RBTree<int> tree;
    tree.insert(10);
    tree.insert(20);
    tree.insert(30);
    tree.insert(40);
    tree.insert(50);
    tree.insert(25);

    cout << "Inorder traversal of the constructed Red-Black Tree is \n";
    tree.inorder();

    return 0;
}

4.代码说明

  1. 节点结构:• 每个节点包含数据、左右子节点指针和颜色标志(红色为 true ,黑色为 false )。• 新插入的节点默认为红色。
  2. 插入操作:• 使用递归的方式将新值插入到合适的位置。• 插入后,通过左旋、右旋和颜色翻转操作来修复红黑树的性质。
  3. 左旋和右旋操作:• 左旋和右旋是调整树结构的关键操作,用于保持红黑树的平衡。
  4. 颜色翻转:• 当一个节点的两个子节点都是红色时,将它们的颜色翻转为黑色,并将当前节点的颜色变为红色。
  5. 中序遍历:• 使用递归的方式进行中序遍历,输出树中的所有节点。
    测试在 main 函数中,插入了一些节点并进行了中序遍历,可以用来验证红黑树的正确性。你可以根据需要进一步扩展代码,例如添加删除操作、查找操作等。
相关推荐
今晚打老虎6 小时前
c++之提高A(前缀和)(第三课)
数据结构·c++·算法
不会就选b7 小时前
算法日常・每日刷题--<贪心>26
数据结构·算法
Logic10111 小时前
C语言/数据结构位运算题解:异或XOR找出书柜中编号只出现一次的那一层——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
青山木11 小时前
Hot 100 --- 下一个排列
java·数据结构·算法·leetcode
SelectDB技术团队13 小时前
Apache Doris 高性能 Open Lake Variant 读写技术解析(含对比数据)
数据结构·数据库·clickhouse·日志·apache doris·selectdb·湖仓架构升级
kiracrimson13 小时前
希尔排序:让插入排序不再怕逆序
数据结构·算法·排序算法
Logic10113 小时前
C语言/数据结构位运算题解:异或XOR找出星球探险中的“独特能量石“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
hnjzsyjyj16 小时前
洛谷 P1339:[USACO09OCT] Heat Wave G ← Bellman-Ford 算法
数据结构·bellman-ford 算法
SelectDB技术团队18 小时前
ClickHouse 存日志的能力边界:并发、检索与 trace 回放的实测对照
数据结构·数据库·clickhouse·日志分析·apache doris·日志存储
垆边人似月.18 小时前
华为算法题:最长连续递增子序列的变
数据结构·算法·leetcode