117.info
人生若只如初见

在C++中实现红黑树的基本结构

红黑树是一种自平衡的二叉搜索树,其基本结构可以通过以下代码实现:

#include 
using namespace std;

enum Color {RED, BLACK};

struct Node {
    int data;
    Color color;
    Node* left;
    Node* right;
    Node* parent;
    
    Node(int val) : data(val), color(RED), left(nullptr), right(nullptr), parent(nullptr) {}
};

class RedBlackTree {
private:
    Node* root;
    
    void leftRotate(Node* x) {
        Node* y = x->right;
        x->right = y->left;
        if (y->left != nullptr) {
            y->left->parent = x;
        }
        y->parent = x->parent;
        if (x->parent == nullptr) {
            root = y;
        } else if (x == x->parent->left) {
            x->parent->left = y;
        } else {
            x->parent->right = y;
        }
        y->left = x;
        x->parent = y;
    }
    
    void rightRotate(Node* y) {
        Node* x = y->left;
        y->left = x->right;
        if (x->right != nullptr) {
            x->right->parent = y;
        }
        x->parent = y->parent;
        if (y->parent == nullptr) {
            root = x;
        } else if (y == y->parent->left) {
            y->parent->left = x;
        } else {
            y->parent->right = x;
        }
        x->right = y;
        y->parent = x;
    }
    
    void fixViolation(Node* z) {
        while (z != root && z->parent->color == RED) {
            if (z->parent == z->parent->parent->left) {
                Node* y = z->parent->parent->right;
                if (y != nullptr && y->color == RED) {
                    z->parent->color = BLACK;
                    y->color = BLACK;
                    z->parent->parent->color = RED;
                    z = z->parent->parent;
                } else {
                    if (z == z->parent->right) {
                        z = z->parent;
                        leftRotate(z);
                    }
                    z->parent->color = BLACK;
                    z->parent->parent->color = RED;
                    rightRotate(z->parent->parent);
                }
            } else {
                Node* y = z->parent->parent->left;
                if (y != nullptr && y->color == RED) {
                    z->parent->color = BLACK;
                    y->color = BLACK;
                    z->parent->parent->color = RED;
                    z = z->parent->parent;
                } else {
                    if (z == z->parent->left) {
                        z = z->parent;
                        rightRotate(z);
                    }
                    z->parent->color = BLACK;
                    z->parent->parent->color = RED;
                    leftRotate(z->parent->parent);
                }
            }
        }
        root->color = BLACK;
    }

public:
    RedBlackTree() : root(nullptr) {}
    
    void insert(int val) {
        Node* z = new Node(val);
        Node* y = nullptr;
        Node* x = root;
        
        while (x != nullptr) {
            y = x;
            if (z->data < x->data) {
                x = x->left;
            } else {
                x = x->right;
            }
        }
        
        z->parent = y;
        if (y == nullptr) {
            root = z;
        } else if (z->data < y->data) {
            y->left = z;
        } else {
            y->right = z;
        }
        
        fixViolation(z);
    }
    
    // Traversal functions (inorder, preorder, postorder)
    // Other functions like delete, search, etc. can also be added
    
};

int main() {
    RedBlackTree rbTree;
    
    rbTree.insert(7);
    rbTree.insert(3);
    rbTree.insert(18);
    rbTree.insert(10);
    rbTree.insert(22);
    
    return 0;
}

在上面的代码中,我们定义了一个Node结构体表示红黑树的节点,其中包含数据值、颜色、左右孩子节点以及父节点。然后定义了一个RedBlackTree类来实现红黑树的基本操作,包括左旋转、右旋转、修正插入操作中可能出现的违反规则的情况等。

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

推荐文章

  • c# winform组件 怎样集成

    在C# WinForms应用程序中集成组件通常涉及以下几个步骤: 添加引用: 首先,确保你已经安装了所需的组件。例如,如果你想要集成一个第三方库,你需要将该库的DLL...

  • c# winform组件 怎样提高效率

    要提高C# WinForms应用程序的效率,可以从多个方面入手,包括优化绘图过程、使用异步操作、合理设置控件属性等。以下是一些具体的优化策略:
    优化绘图过程 ...

  • c# winform组件 怎样自定义

    在C#中,要自定义WinForms组件,您需要创建一个继承自现有控件的新类,并重写其构造函数、事件处理程序和其他相关方法。以下是一个简单的示例,说明如何创建一个...

  • c# winform组件 怎样选择合适

    在C# WinForms应用程序开发中,选择合适的组件对于构建高效、用户友好的界面至关重要。以下是一些选择合适组件的建议:
    控件选择 根据需求选择:选择控件时...

  • 红黑树入门:理解C++中的自平衡机制

    红黑树是一种自平衡的二叉查找树,它的目的是保持树的高度近似平衡,以确保在最坏情况下的查找、插入和删除操作的时间复杂度为O(log n)。在C++中,STL的map和set...

  • 通过修改/etc/fstab在Ubuntu中设置延迟挂载、noatime选项等

    要在Ubuntu中设置延迟挂载和noatime选项,可以通过修改/etc/fstab文件来实现。
    首先,打开终端并输入以下命令以编辑/etc/fstab文件:
    sudo nano /etc/...

  • Ubuntu处理“磁盘已满”警告时的最佳实践

    当Ubuntu系统出现“磁盘已满”的警告时,以下是一些最佳实践: 清理临时文件:删除系统中的临时文件和缓存文件,可以通过运行sudo apt-get clean和sudo apt-get ...

  • Ubuntu挂载Git仓库作为本地目录

    要在Ubuntu上挂载Git仓库作为本地目录,可以使用以下步骤: 首先,确保你已经安装了Git和FUSE(Filesystem in Userspace)工具。如果没有安装,可以使用以下命令...