珂朵莉树C++

该文介绍了一个C++实现的珂朵莉树模板,它结合了二叉搜索树和堆的特性。通过插入和删除操作,保持树的平衡性,并利用优先级进行旋转。代码中包含了插入、删除节点以及中序遍历的功能,展示了如何在实际应用中使用珂朵莉树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

珂朵莉树 (Treap) 是一种结合了二叉搜索树和堆的数据结构。以下是一个简单的珂朵莉树模板的C++实现

#include <iostream>

using namespace std;

struct Node {
    int key, priority;
    Node* left;
    Node* right;

    Node(int k) : key(k), priority(rand()), left(nullptr), right(nullptr) {}
};

class Treap {
private:
    Node* root;
   
    Node* rotateLeft(Node* node) {
        Node* newRoot = node->right;
        node->right = newRoot->left;
        newRoot->left = node;
        return newRoot;
    }

    Node* rotateRight(Node* node) {
        Node* newRoot = node->left;
        node->left = newRoot->right;
        newRoot->right = node;
        return newRoot;
    }

public:
    Treap() : root(nullptr) {}

    void insert(int key) {
        root = insertHelper(root, key);
    }

    Node* insertHelper(Node* node, int key) {
        if (node == nullptr) {
            return new Node(key);
        }

        if (key < node->key) {
            node->left = insertHelper(node->left, key);
            
            // Perform rotation if necessary based on priority
            if (node->left->priority > node->priority) {
                node = rotateRight(node);
            }
        } else {
            node->right = insertHelper(node->right, key);
            
            // Perform rotation if necessary based on priority
            if (node->right->priority > node->priority) {
                node = rotateLeft(node);
            }
        }

        return node;
    }

    void remove(int key) {
        root = removeHelper(root, key);
    }

    Node* removeHelper(Node* node, int key) {
        if (node == nullptr) {
            return nullptr;
        }

        if (key < node->key) {
            node->left = removeHelper(node->left, key);
        } else if (key > node->key) {
            node->right = removeHelper(node->right, key);
        } else {
            if (node->left == nullptr && node->right == nullptr) {
                delete node;
                return nullptr;
            } else if (node->left == nullptr) {
                Node* temp = node->right;
                delete node;
                return temp;
            } else if (node->right == nullptr) {
                Node* temp = node->left;
                delete node;
                return temp;
            } else {
                if (node->left->priority > node->right->priority) {
                    node = rotateRight(node);
                    node->right = removeHelper(node->right, key);
                } else {
                    node = rotateLeft(node);
                    node->left = removeHelper(node->left, key);
                }
            }
        }

        return node;
    }

    void inorderTraversal() {
        inorderHelper(root);
    }

    void inorderHelper(Node* node) {
        if (node == nullptr) {
            return;
        }

        inorderHelper(node->left);
        cout << node->key << " ";
        inorderHelper(node->right);
    }
};

int main() {
    Treap treap;
    treap.insert(4);
    treap.insert(2);
    treap.insert(6);
    treap.insert(1);
    treap.insert(3);
    treap.insert(5);
    treap.insert(7);

    cout << "Inorder traversal: ";
    treap.inorderTraversal();
    cout << endl;

    treap.remove(3);

    cout << "Inorder traversal after removing 3: ";
    treap.inorderTraversal();
    cout << endl;

    return 0;
}

在这个示例中,我们定义了一个`Node`结构体来表示树的节点,包括键值`key`和优先级`priority`,以及左右子节点`left`和`right`。然后,我们定义了一个`Treap`类,其中包含了一些基本的操作,如`insert`插入节点,`remove`删除节点和`inorderTraversal`中序遍历等。在`insert`和`remove`操作中,我们根据节点的键值和优先级来进行旋转操作,确保树的平衡性和堆的性质。最后,在主函数中我们演示了如何使用珂朵莉树进行插入和删除操作,并进行中序遍历输出结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值