Treap树

/**************************
* @author xiaolin
* @date 2023-3-14
**************************/
#include <iostream>
#include <stdlib.h>
#include <vector>
#include <stdio.h>
using namespace std;
int nums[100] = {1, 2, 3, 4, 5, 6};
struct TreeNode
{
    int value;
    int priority;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int _value, int _priority, TreeNode* _left = NULL, TreeNode* _right = NULL):
        value(_value),
        priority(_priority),
        left(_left),
        right(_right)
    {}
};

void lrevolve(TreeNode* &root) {
    TreeNode *k = root->right;
    root->right = k->left;
    k->left = root;
    root = k;
}

void rrevolve(TreeNode* &root) {
    TreeNode *k = root->left;
    root->left = k->right;
    k->right = root;
    root = k;
}


void insert(TreeNode* &root, int _value)
{
    if(root == NULL){
        int num = rand();
        root = new TreeNode(_value, num);
        //printf("rank: %d\n", num);
    }
    else{
        if(root->value == _value) return ;
        else if(_value > root->value) insert(root->left, _value);
        else insert(root->right, _value);
    }
    
    if(root->left && root->left->priority > root->priority) rrevolve(root);
    else if(root->right && root->right->priority > root->priority) lrevolve(root);
    
}

void tdelete(TreeNode* &p, int _value)
{
    if(p->value == _value){
        if(p->left == NULL && p->right == NULL){
            delete p;
            p = NULL;
        }
        else if(p->left != NULL && p->right == NULL){
            TreeNode* temp = p;
            p = p->left;
            delete temp;
            temp = NULL;
        }
        else if(p->left == NULL && p->right != NULL){
            TreeNode* temp = p;
            p = p->right;
            delete temp;
            temp = NULL;
        }
        // 左右都有子树
        else if(p->left != NULL && p->right != NULL){
            if (p->left->priority > p->right->priority) {
                rrevolve(p);
                tdelete(p->right, _value);
            } else if (p->left->priority < p->right->priority) {
                lrevolve(p);
                tdelete(p->left, _value);
            }
        }
    }
    else if(_value > p->value)
        tdelete(p->left, _value);
    else tdelete(p->right, _value);
}

void TreePrint(TreeNode* root)
{
    if(root != NULL){
        
        TreePrint(root->left);
        printf("%d ", root->value);
        TreePrint(root->right);
    }
}


int main()
{
    TreeNode* root = NULL;
    for(int i=0;i<6;i++){
        insert(root, nums[i]);
    }
    TreePrint(root);
    printf("\n");
    tdelete(root, 4);
    TreePrint(root);
    return 0;
}



posted @ 2023-03-14 22:51  小麟qwq  阅读(14)  评论(0)    收藏  举报