为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

Code:Treap/C

来自NOCOW
(跳转自Treap C)
跳转到: 导航, 搜索
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
typedef struct Node {
        int data;
        long k;
        struct Node *left,*right,*parent;
        } NODE ;
typedef struct {
        NODE *head;
        } BST;
NODE * Search(NODE *root, int x);
void Insert(BST *t, int x);
void Delete(BST *t, int x);
void Init(BST *t, int x);
void dfs(NODE *root);
int main()
{
    int i,j,k;
    BST t;
    NODE *node;
    srand((unsigned)time(NULL));
    t.head = NULL;
    Init(&t, 10);
    Insert(&t, 5);
    Insert(&t, 3);
    Insert(&t, 2);
    Insert(&t, 6);
    Insert(&t, 11);
    Delete(&t, 6);
    node = Search(t.head, 5);
    if (node)
       printf("%d\n",node->data);
    dfs(t.head);
    printf("\n");
    system("pause");
    return 0;
}
NODE * Search(NODE *root, int x)
{
     while (root && root->data!=x)
     {
           if (root->data>x)
              root = root->left;
           else
               root = root->right;
     }
     return root;
}
 
void Insert(BST *t, int x)
{
     NODE *node,*child,*parent,*root;
     root = t->head;
     node = root;
     child = root;
     while (node && child)
     {
           if (node->data==x)
              child = NULL;
           else
           {
               parent = node;
               if (node->data>x)
                  node = node->left;
               else
                   node = node->right;
           }
     }
     if (child)
     {
         child = (NODE *)malloc(sizeof(NODE));
         child->left = child->right = NULL;
         child->k = rand();
         child->data = x;
         child->parent = parent;
         if (parent->data>x)
            parent->left = child;
         else
             parent->right = child;
         node = child;
         while (node->parent->parent && node->k<node->parent->k)
         {
               parent = node->parent;
               if (node->data<parent->data)
               {
                   parent->left = node->right;
                   if (node->right)
                   {
                      parent->left->parent = parent;
                   }
                   node->right = parent;
                   if (parent->data<parent->parent->data)
                       parent->parent->left = node;
                   else
                       parent->parent->right = node;
               }
               else
               {
                   parent->right = node->left;
                   if (node->left)
                   {
                      parent->right->parent = parent;
                   }
                   node->left = parent;
                   if (parent->data<parent->parent->data)
                   {
                       parent->parent->left = node;
                   }
                   else
                   {
                       parent->parent->right = node;
                   }
               }
               node->parent = parent->parent;
               parent->parent = node;
         }
         if (node->parent==root && node->k<root->k)
         {
             if (node->data<root->data)
             {
                 root->left = node->right;
                 if (node->right)
                    root->left->parent = root;
                 node->right = root;
             }
             else
             {
                 root->right = node->left;
                 if (node->left)
                    root->right->parent = root;
                 node->left = root;
             }
             root->parent = node;
             node->parent = NULL;
             t->head = node;
         }
     }
     return ;
}
void Delete(BST *t,int x)
{
     NODE *node,*parent,*node1,*parent1,*root;
     int temp;
     root = t->head;
     node = root;
     while (node && node->data!=x)
     {
           parent = node;
           if (node->data>x)
              node = node->left;
           else
               node = node->right;
     }
     if (!node)
        return;
     if (node!=root)
     {
         node->k = 1000000;
         while (node->left || node->right)
         {
               if (node->left)
               {
                  node1 = node->left;
                  node->left = node1->right;
                  if (node1->right)
                     node1->right->parent = node;
               }
               else
               {
                   node1 = node->right;
                   node->right = node1->left;
                   if (node1->left)
                      node1->left->parent = node;
               }
               if (node->parent->data>node->data)
                  node->parent->left = node1;
               else
                  node->parent->right = node1;
               node1->parent = node->parent;
               node->parent = node1;
         }
         if (node->data<node->parent->data)
            node->parent->left = NULL;
         else
             node->parent->right = NULL;
         free(node);
     }
     return ;
}
void Init(BST *t, int x)
{
     t->head = (NODE *)malloc(sizeof(NODE));
     t->head->left = t->head->right = NULL;
     t->head->data = x;
     t->head->k = rand();
     t->head->parent = NULL;
     return ;
}
void dfs(NODE *root)
{
     if (root)
     {
        dfs(root->left);
        printf("%d ",root->data);
        dfs(root->right);
     }
     return ;
}
个人工具