Treap堆的插入,删除操作

来源:互联网 发布:centos 指定ip访问ssh 编辑:程序博客网 时间:2024/05/02 04:16
#include <stdio.h>#include <stdlib.h>#include <iomanip>#include <time.h>#include <iostream>using namespace std;typedef struct node{  node* left;  node* right;  int priority;  int key;}*Node;typedef struct treap{  Node root;}*Treap;void rotate_left(Node node){  Node x = node->right;  node->right = x->left;  x->left = node;  node = x;}void rotate_right(Node node){  Node x = node->left;  node->left = x->right;  x->right = node;  node = x;}void insert(Node root, int key, int priority){  if (root == NULL)  {    root = (Node)malloc(sizeof(Node));    root->left = NULL;    root->right = NULL;    root->priority = priority;    root->key = key;  }  else if (key < root->key)  {    insert(&(root->left), key, priority);    if (root->left->priority < root->priority)      rotate_right(root);  }  else  {    insert(&(root->right), key, priority);    if (root->right->priority < root->priority)      rotate_left(root);  }}void deletenode(Node root, int key){  if (root != NULL)  {    if (key < root->key)      deletenode(&(root->left), key);    else if (key > root->key)      deletenode(&(root->right), key);    else    {      if (root->left == NULL)        root = root->right;      else if (root->right == NULL)        root = root->left;      else      {        if (root->left->priority < root->right->priority)        {          rotate_right(root);          deletenode(&(root->right), key);        }        else        {          rotate_left(root);          deletenode(&(root->left), key);        }      }    }  }}void output(Node tree, int key, int x){    if(tree != NULL)    {        if(x==0)    cout << setw(2) << tree->key <<" is root" << "  优先级为:"<<tree->priority<<endl;        else                cout << setw(2) << tree->key <<" is " << setw(2) << key << "'s "  << setw(12) << (x==1?"right child" : "left child") << "  优先级为:"<<tree->priority<<endl;        output(tree->left, tree->key, -1);        output(tree->right,tree->key,  1);    }}void output(Node mRoot){    if (mRoot != NULL)output(mRoot, mRoot->key, 0);}int main(){  Treap treap = (Treap)malloc(sizeof(Treap));  treap->root = NULL;  int i = 0;  cout<<"请输入要插入的节点的数目:"<<endl;  int n,a[20];  cin>>n;  srand(time(0));  cout<<"请输入要插入节点的key值:"<<endl;  for (i = 0; i < n; i++)  {cin>>a[i];    insert(&(treap->root), a[i], rand());  }  output(treap->root);    cout<<"请输入要删除节点的key值:"<<endl;cin>>n;    deletenode(&(treap->root), n);output(treap->root);  system("pause");  return 0;}

0 0
原创粉丝点击