中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

通過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
洛宁县| 阳山县| 固安县| 昭苏县| 石首市| 钟祥市| 普安县| 德兴市| 漳浦县| 墨江| 礼泉县| 揭阳市| 安丘市| 阳山县| 志丹县| 孟村| 桐柏县| 介休市| 铅山县| 乐昌市| 陇川县| 朝阳市| 安徽省| 邵东县| 陆川县| 宁强县| 平乡县| 隆子县| 宿州市| 新巴尔虎左旗| 台中县| 林西县| 镇宁| 田东县| 兰坪| 连城县| 吕梁市| 苗栗县| 江西省| 南汇区| 斗六市|