using
System;
class
TreapNode
{
public
int
key, priority;
public
TreapNode left, right;
}
class
Program
{
static
Random rand =
new
Random();
static
TreapNode rightRotate(TreapNode y)
{
TreapNode x = y.left;
TreapNode T2 = x.right;
x.right = y;
y.left = T2;
return
x;
}
static
TreapNode leftRotate(TreapNode x)
{
TreapNode y = x.right;
TreapNode T2 = y.left;
y.left = x;
x.right = T2;
return
y;
}
static
TreapNode newNode(
int
key)
{
TreapNode temp =
new
TreapNode();
temp.key = key;
temp.priority = rand.Next(100);
temp.left = temp.right =
null
;
return
temp;
}
static
TreapNode insert(TreapNode root,
int
key)
{
if
(root ==
null
)
{
return
newNode(key);
}
if
(key <= root.key)
{
root.left = insert(root.left, key);
if
(root.left.priority > root.priority)
{
root = rightRotate(root);
}
}
else
{
root.right = insert(root.right, key);
if
(root.right.priority > root.priority)
{
root = leftRotate(root);
}
}
return
root;
}
static
TreapNode deleteNode(TreapNode root,
int
key)
{
if
(root ==
null
)
{
return
root;
}
if
(key < root.key)
{
root.left = deleteNode(root.left, key);
}
else
if
(key > root.key)
{
root.right = deleteNode(root.right, key);
}
else
if
(root.left ==
null
)
{
TreapNode temp = root.right;
root = temp;
}
else
if
(root.right ==
null
)
{
TreapNode temp = root.left;
root = temp;
}
else
if
(root.left.priority < root.right.priority)
{
root = leftRotate(root);
root.left = deleteNode(root.left, key);
}
else
{
root = rightRotate(root);
root.right = deleteNode(root.right, key);
}
return
root;
}
static
TreapNode search(TreapNode root,
int
key)
{
if
(root ==
null
|| root.key == key)
{
return
root;
}
if
(root.key < key)
{
return
search(root.right, key);
}
return
search(root.left, key);
}
static
void
inorder(TreapNode root)
{
if
(root !=
null
)
{
inorder(root.left);
Console.Write(
"key: "
+ root.key +
" | priority: "
+ root.priority);
if
(root.left !=
null
)
{
Console.Write(
" | left child: "
+ root.left.key);
}
if
(root.right !=
null
)
{
Console.Write(
" | right child: "
+ root.right.key);
}
Console.WriteLine();
inorder(root.right);
}
}
static
void
Main(
string
[] args)
{
TreapNode root =
null
;
root = insert(root, 50);
root = insert(root, 30);
root = insert(root, 20);
root = insert(root, 40);
root = insert(root, 70);
root = insert(root, 60);
root = insert(root, 80);
Console.WriteLine(
"Inorder traversal of the given tree:"
);
inorder(root);
Console.WriteLine(
"\nDelete 20"
);
root = deleteNode(root, 20);
Console.WriteLine(
"Inorder traversal of the modified tree:"
);
inorder(root);
Console.WriteLine(
"\nDelete 30"
);
root = deleteNode(root, 30);
Console.WriteLine(
"Inorder traversal of the modified tree:"
);
inorder(root);
Console.WriteLine(
"\nDelete 50"
);
root = deleteNode(root, 50);
Console.WriteLine(
"Inorder traversal of the modified tree:"
);
inorder(root);
TreapNode res = search(root, 50);
Console.WriteLine(res ==
null
?
"\n50 Not Found"
:
"\n50 found"
);
}
};