红黑树是一种自平衡的二叉查找树,它具有以下特点:

1.每个节点要么是红色,要么是黑色。 2.根节点是黑色的。 3.每个叶子节点都是黑色的空节点(NIL节点)。 4.如果一个节点是红色的,则它的子节点必须是黑色的。 5.从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。

下面是红黑树的实现代码:

class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* parent;
    bool is_red;
};

class RedBlackTree {
public:
    RedBlackTree() {
        nil = new Node();
        nil->is_red = false;
        root = nil;
    }

    void insert(int val) {
        Node* node = new Node();
        node->val = val;
        node->left = nil;
        node->right = nil;
        node->parent = nil;
        node->is_red = true;

        Node* y = nil;
        Node* x = root;
        while (x != nil) {
            y = x;
            if (val < x->val) {
                x = x->left;
            } else {
                x = x->right;
            }
        }

        node->parent = y;
        if (y == nil) {
            root = node;
        } else if (val < y->val) {
            y->left = node;
        } else {
            y->right = node;
        }

        insert_fixup(node);
    }

    void remove(int val) {
        Node* z = find(val);
        if (z == nil) {
            return;
        }

        Node* y = nil;
        if (z->left == nil || z->right == nil) {
            y = z;
        } else {
            y = successor(z);
        }

        Node* x = nil;
        if (y->left != nil) {
            x = y->left;
        } else {
            x = y->right;
        }

        x->parent = y->parent;
        if (y->parent == nil) {
            root = x;
        } else if (y == y->parent->left) {
            y->parent->left = x;
        } else {
            y->parent->right = x;
        }

        if (y != z) {
            z->val = y->val;
        }

        if (!y->is_red) {
            remove_fixup(x);
        }

        delete y;
    }

private:
    Node* root;
    Node* nil;

    Node* find(int val) {
        Node* cur = root;
        while (cur != nil) {
            if (val == cur->val) {
                return cur;
            } else if (val < cur->val) {
                cur = cur->left;
            } else {
                cur = cur->right;
            }
        }
        return nil;
    }

    Node* minimum(Node* node) {
        while (node->left != nil) {
            node = node->left;
        }
        return node;
    }

    Node* maximum(Node* node) {
        while (node->right != nil) {
            node = node->right;
        }
        return node;
    }

    Node* successor(Node* node) {
        if (node->right != nil) {
            return minimum(node->right);
        }

        Node* parent = node->parent;
        while (parent != nil && node == parent->right) {
            node = parent;
            parent = parent->parent;
        }

        return parent;
    }

    Node* predecessor(Node* node) {
        if (node->left != nil) {
            return maximum(node->left);
        }

        Node* parent = node->parent;
        while (parent != nil && node == parent->left) {
            node = parent;
            parent = parent->parent;
        }

        return parent;
    }

    void left_rotate(Node* x) {
        Node* y = x->right;
        x->right = y->left;
        if (y->left != nil) {
            y->left->parent = x;
        }

        y->parent = x->parent;
        if (x->parent == nil) {
            root = y;
        } else if (x == x->parent->left) {
            x->parent->left = y;
        } else {
            x->parent->right = y;
        }

        y->left = x;
        x->parent = y;
    }

    void right_rotate(Node* x) {
        Node* y = x->left;
        x->left = y->right;
        if (y->right != nil) {
            y->right->parent = x;
        }

        y->parent = x->parent;
        if (x->parent == nil) {
            root = y;
        } else if (x == x->parent->left) {
            x->parent->left = y;
        } else {
            x->parent->right = y;
        }

        y->right = x;
        x->parent = y;
    }

    void insert_fixup(Node* z) {
        while (z->parent->is_red) {
            if (z->parent == z->parent->parent->left) {
                Node* y = z->parent->parent->right;
                if (y->is_red) {
                    z->parent->is_red = false;
                    y->is_red = false;
                    z->parent->parent->is_red = true;
                    z = z->parent->parent;
                } else {
                    if (z == z->parent->right) {
                        z = z->parent;
                        left_rotate(z);
                    }
                    z->parent->is_red = false;
                    z->parent->parent->is_red = true;
                    right_rotate(z->parent->parent);
                }
            } else {
                Node* y = z->parent->parent->left;
                if (y->is_red) {
                    z->parent->is_red = false;
                    y->is_red = false;
                    z->parent->parent->is_red = true;
                    z = z->parent->parent;
                } else {
                    if (z == z->parent->left) {
                        z = z->parent;
                        right_rotate(z);
                    }
                    z->parent->is_red = false;
                    z->parent->parent->is_red = true;
                    left_rotate(z->parent->parent);
                }
            }
        }
        root->is_red = false;
    }

    void remove_fixup(Node* x) {
        while (x != root && !x->is_red) {
            if (x == x->parent->left) {
                Node* w = x->parent->right;
                if (w->is_red) {
                    w->is_red = false;
                    x->parent->is_red = true;
                    left_rotate(x->parent);
                    w = x->parent->right;
                }
                if (!w->left->is_red && !w->right->is_red) {
                    w->is_red = true;
                    x = x->parent;
                } else {
                    if (!w->right->is_red) {
                        w->left->is_red = false;
                        w->is_red = true;
                        right_rotate(w);
                        w = x->parent->right;
                    }
                    w->is_red = x->parent->is_red;
                    x->parent->is_red = false;
                    w->right->is_red = false;
                    left_rotate(x->parent);
                    x = root;
                }
            } else {
                Node* w = x->parent->left;
                if (w->is_red) {
                    w->is_red = false;
                    x->parent->is_red = true;
                    right_rotate(x->parent);
                    w = x->parent->left;
                }
                if (!w->right->is_red && !w->left->is_red) {
                    w->is_red = true;
                    x = x->parent;
                } else {
                    if (!w->left->is_red) {
                        w->right->is_red = false;
                        w->is_red = true;
                        left_rotate(w);
                        w = x->parent->left;
                    }
                    w->is_red = x->parent->is_red;
                    x->parent->is_red = false;
                    w->left->is_red = false;
                    right_rotate(x->parent);
                    x = root;
                }
            }
        }
        x->is_red = false;
    }
};
帮我写个红黑树底层

原文地址: https://www.cveoy.top/t/topic/bibG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录