Treap是一种二叉搜索树和堆(Heap)的结合体,它的每个节点都有两个属性:一个关键字(Key)和一个随机优先级(Priority)。它满足二叉搜索树的性质,同时也满足堆的性质,即父节点的优先级比子节点的优先级高。
下面是一个简单的C++实现Treap的示例:
#include <iostream>
#include <cstdlib>
#include <ctime>
class TreapNode {
public:
int key;
int priority;
TreapNode* left;
TreapNode* right;
TreapNode(int k) : key(k), priority(rand()), left(nullptr), right(nullptr) {}
};
class Treap {
private:
TreapNode* root;
// 左旋转操作
TreapNode* leftRotate(TreapNode* node) {
TreapNode* newRoot = node->right;
node->right = newRoot->left;
newRoot->left = node;
return newRoot;
}
// 右旋转操作
TreapNode* rightRotate(TreapNode* node) {
TreapNode* newRoot = node->left;
node->left = newRoot->right;
newRoot->right = node;
return newRoot;
}
// 插入辅助函数
TreapNode* insertHelper(TreapNode* node, int key) {
if (node == nullptr) {
return new TreapNode(key);
}
if (key < node->key) {
node->left = insertHelper(node->left, key);
if (node->left->priority > node->priority) {
node = rightRotate(node);
}
} else {
node->right = insertHelper(node->right, key);
if (node->right->priority > node->priority) {
node = leftRotate(node);
}
}
return node;
}
// 查找辅助函数
bool searchHelper(TreapNode* node, int key) {
if (node == nullptr) {
return false;
}
if (key == node->key) {
return true;
}
if (key < node->key) {
return searchHelper(node->left, key);
} else {
return searchHelper(node->right, key);
}
}
public:
Treap() : root(nullptr) {
srand(time(nullptr));
}
// 插入操作
void insert(int key) {
root = insertHelper(root, key);
}
// 查找操作
bool search(int key) {
return searchHelper(root, key);
}
};
int main() {
Treap treap;
// 插入一些元素
treap.insert(5);
treap.insert(3);
treap.insert(7);
// 查找元素
std::cout << "Is 3 in the treap? " << std::boolalpha << treap.search(3) << std::endl;
std::cout << "Is 6 in the treap? " << std::boolalpha << treap.search(6) << std::endl;
return 0;
}
在这个示例中,TreapNode 类表示Treap中的节点,包含了关键字和优先级两个属性,以及左右子节点的指针。Treap 类表示Treap本身,它包含了一个指向根节点的指针。insert() 方法用于插入一个元素到Treap中,search() 方法用于查找一个元素是否在Treap中。在插入操作中,通过递归的方式按照二叉搜索树的性质插入新的节点,并根据优先级进行旋转操作以维护Treap的堆性质。