珂朵莉树 (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`操作中,我们根据节点的键值和优先级来进行旋转操作,确保树的平衡性和堆的性质。最后,在主函数中我们演示了如何使用珂朵莉树进行插入和删除操作,并进行中序遍历输出结果。