c++实现Treap

76 阅读2分钟

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的堆性质。