/**************************
* @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;
}