亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

通過C++實踐深入探討紅黑樹的性質

c++
小樊
82
2024-04-26 19:07:59
欄目: 編程語言

紅黑樹是一種自平衡二叉搜索樹,它在插入和刪除元素時能夠保持樹的平衡,從而保證了樹的查找、插入和刪除操作的時間復雜度都是O(logn)。紅黑樹有以下幾個性質:

  1. 每個節點要么是黑色,要么是紅色。
  2. 根節點是黑色。
  3. 每個葉子節點(NIL節點)是黑色。
  4. 如果一個節點是紅色,則它的子節點都是黑色。
  5. 對于每個節點,從該節點到其所有后代葉子節點的簡單路徑上,均包含相同數量的黑色節點。

下面是一個簡單的C++實現紅黑樹的例子:

#include <iostream>
#include <vector>

enum Color { RED, BLACK };

template <typename T>
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 <typename T>
class RedBlackTree {
public:
    RedBlackTree() : root(nullptr) {}

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

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

private:
    Node<T>* root;

    void insertNode(Node<T>* node) {
        Node<T>* temp = nullptr;
        Node<T>* 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<T>* node) {
        while (node != root && node->parent->color == RED) {
            if (node->parent == node->parent->parent->left) {
                Node<T>* 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<T>* 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<T>* node) {
        Node<T>* 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<T>* node) {
        Node<T>* 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

0
广河县| 赫章县| 疏附县| 云龙县| 葫芦岛市| 儋州市| 平陆县| 常州市| 江津市| 清镇市| 清苑县| 沂源县| 威海市| 长葛市| 安化县| 靖边县| 开阳县| 日照市| 高密市| 青川县| 楚雄市| 广东省| 邳州市| 神木县| 略阳县| 绍兴县| 上思县| 东乌珠穆沁旗| 三原县| 龙海市| 揭西县| 调兵山市| 东平县| 寿宁县| 杨浦区| 枞阳县| 应城市| 沂源县| 吴江市| 宜兰县| 蓝田县|