117.info
人生若只如初见

通过C++实践深入探讨红黑树的性质

红黑树是一种自平衡二叉搜索树,它在插入和删除元素时能够保持树的平衡,从而保证了树的查找、插入和删除操作的时间复杂度都是O(logn)。红黑树有以下几个性质:

  1. 每个节点要么是黑色,要么是红色。
  2. 根节点是黑色。
  3. 每个叶子节点(NIL节点)是黑色。
  4. 如果一个节点是红色,则它的子节点都是黑色。
  5. 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数量的黑色节点。

下面是一个简单的C++实现红黑树的例子:

#include 
#include 

enum Color { RED, BLACK };

template 
struct Node {
    T data;
    Color color;
    Node* left;
    Node* right;
    Node* parent;

    Node(T data) : data(data), color(RED), left(nullptr), right(nullptr), parent(nullptr) {}
};

template 
class RedBlackTree {
public:
    RedBlackTree() : root(nullptr) {}

    void insert(T data) {
        Node* node = new Node(data);
        insertNode(node);
        fixInsert(node);
    }

    void printInorder() {
        printInorderHelper(root);
        std::cout << std::endl;
    }

private:
    Node* root;

    void insertNode(Node* node) {
        Node* temp = nullptr;
        Node* current = root;

        while (current != nullptr) {
            temp = current;
            if (node->data < current->data) {
                current = current->left;
            } else {
                current = current->right;
            }
        }

        node->parent = temp;
        if (temp == nullptr) {
            root = node;
        } else if (node->data < temp->data) {
            temp->left = node;
        } else {
            temp->right = node;
        }
    }

    void fixInsert(Node* node) {
        while (node != root && node->parent->color == RED) {
            if (node->parent == node->parent->parent->left) {
                Node* uncle = node->parent->parent->right;
                if (uncle->color == RED) {
                    node->parent->color = BLACK;
                    uncle->color = BLACK;
                    node->parent->parent->color = RED;
                    node = node->parent->parent;
                } else {
                    if (node == node->parent->right) {
                        node = node->parent;
                        leftRotate(node);
                    }
                    node->parent->color = BLACK;
                    node->parent->parent->color = RED;
                    rightRotate(node->parent->parent);
                }
            } else {
                Node* uncle = node->parent->parent->left;
                if (uncle->color == RED) {
                    node->parent->color = BLACK;
                    uncle->color = BLACK;
                    node->parent->parent->color = RED;
                    node = node->parent->parent;
                } else {
                    if (node == node->parent->left) {
                        node = node->parent;
                        rightRotate(node);
                    }
                    node->parent->color = BLACK;
                    node->parent->parent->color = RED;
                    leftRotate(node->parent->parent);
                }
            }
        }
        root->color = BLACK;
    }

    void leftRotate(Node* node) {
        Node* temp = node->right;
        node->right = temp->left;
        if (temp->left != nullptr) {
            temp->left->parent = node;
        }
        temp->parent = node->parent;
        if (node->parent == nullptr) {
            root = temp;
        } else if (node == node->parent->left) {
            node->parent->left = temp;
        } else {
            node->parent->right = temp;
        }
        temp->left = node;
        node->parent = temp;
    }

    void rightRotate(Node* node) {
        Node* temp = node->left;
        node->left = temp->right;
        if (temp->right != nullptr) {
            temp->right->parent = node;
        }
        temp->parent = node->parent;
        if (node->parent == nullptr) {
            root = temp;
        } else if (node == node->parent->right) {
            node->parent->right

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe4baAzsIBgVfAVY.html

推荐文章

  • c#中checkedlistbox的用途有哪些

    在C#中,CheckedListBox是一个Windows窗体控件,可以显示一个复选框列表,用户可以选择其中的一项或多项。CheckedListBox的主要用途包括但不限于以下几个方面: ...

  • c#中checkedlistbox的作用是什么

    在C#中,CheckedListBox控件是Windows窗体应用程序中的一个控件,用于显示一个包含复选框的列表,用户可以通过勾选或取消勾选复选框来选择列表中的项。CheckedLi...

  • c#中checkedlistbox的用法是什么

    在C#中,CheckedListBox是一个Windows Forms控件,用于显示一个带有复选框的列表。用户可以选择其中的项,同时还可以选择哪些项被选中。CheckedListBox控件通常用...

  • c++如何读取yaml文件

    在C++中读取YAML文件通常需要使用第三方库,比如yaml-cpp。以下是一个简单的示例代码,演示如何使用yaml-cpp库读取YAML文件:
    首先,需要下载yaml-cpp库并将...

  • 红黑树的验证:确保树的平衡性和有效性

    红黑树的验证包括以下几个步骤: 每个节点要么是红色,要么是黑色。
    根节点是黑色。
    每个叶子节点(NIL节点)是黑色。
    如果一个节点是红色,则它...

  • 在C++中使用红黑树进行范围搜索

    #include #include using namespace std; // 定义红黑树
    set rbTree; // 执行范围搜索
    void rangeSearch(int start, int end) { set::iterator it = r...

  • 理解红黑树的颜色翻转和旋转操作

    红黑树是一种自平衡二叉搜索树,其特点是每个节点都带有颜色属性,可以是红色或黑色。在插入或删除节点时,可能会破坏红黑树的性质,需要进行颜色翻转和旋转操作...

  • 实现一个红黑树迭代器:C++编程挑战

    #include #include #include enum Color { RED, BLACK
    }; struct Node { int data; Color color; Node* left; Node* right; Node* parent; Node(int data, ...