Treap标准模板

原创 2016年08月29日 20:20:29

这是Treap的模板程序,支持Left/Right Rotate,Find the maxnum/minnum,Find the predecessor/successor of a node,Add/Delete nodes 等绝大多数功能(不包含类似于”查找排名第k的元素”这样奇怪的东西的代码;
直接上代码,具体教程请看本人的另一篇博客!!!

#include<bits/stdc++.h>
#include<windows.h>
#define maxn 1000001
#define Random(x) (rand()%x)
#define ALLOW
#define query_pred_succ
#define query_delete

using namespace std;

typedef struct{
    int leftnode,rightnode,data,fix;        //data为数值,fix为修正值
    bool symbol;    //记录当前节点是否是空节点,0为空,1为非空 
}node;

class treap
{
    public:
        node p[maxn];
        int size,root;
        treap()
        {
            srand(time(0));
            size=0;
            root=0;
        }
        void Treap_Left_Rotate(int &x)
        {
            int y=p[x].rightnode;
            p[x].rightnode=p[y].leftnode;
            p[y].leftnode=x;
            x=y;
        }
        void Treap_Right_Rotate(int &x)
        {
            int y=p[x].leftnode;
            p[x].leftnode=p[y].rightnode;
            p[y].rightnode=x;
            x=y;
        }
        void Treap_insert(int &k,int key)
        {
            if (k==0)
            {
                k=++size;
                p[k].leftnode=p[k].rightnode=0;
                p[k].data=key;
                p[k].fix=rand();
            } else
            if (key<p[k].data)
            {
                Treap_insert(p[k].leftnode,key);
                if (p[p[k].leftnode].fix>p[k].fix)
                    Treap_Right_Rotate(k);
            }
            else
            {
                Treap_insert(p[k].rightnode,key);
                if (p[p[k].rightnode].fix>p[k].fix)
                    Treap_Left_Rotate(k);
            }
        }
        void Treap_delete(int &k,int key)
        {
            if (k==0) return;
            if (key==p[k].data)
            {
                if (p[k].leftnode==0 && p[k].rightnode==0) k=0;
                    else if (p[k].leftnode==0 && p[k].rightnode!=0) k=p[k].rightnode;
                        else if (p[k].leftnode!=0 && p[k].rightnode==0) k=p[k].leftnode;
                            else
                            if (p[p[k].leftnode].fix<p[p[k].rightnode].fix)
                            {
                                Treap_Left_Rotate(k);
                                Treap_delete(p[k].leftnode,key);
                            }
                            else
                            {
                                Treap_Right_Rotate(k);
                                Treap_delete(p[k].rightnode,key);
                            }
            } else
            if (key<p[k].data) Treap_delete(p[k].leftnode,key);
                else Treap_delete(p[k].rightnode,key);
        }
        void in_order_print(int k)
        {
            p[k].symbol=1;
            if (p[k].leftnode!=0)
                in_order_print(p[k].leftnode);
            printf("第%d个节点 : 值:%d   修正值:%d  左孩子:%d  右孩子:%d\n",k,p[k].data,p[k].fix,p[k].leftnode,p[k].rightnode);
            if (p[k].rightnode!=0)
                in_order_print(p[k].rightnode);
        }
        int find_max(int k)
        {
            if (p[k].rightnode!=0)
                return find_max(p[k].rightnode);
            else return p[k].data;
        }
        int find_min(int k)
        {
            if (p[k].leftnode!=0)
                return find_min(p[k].leftnode);
            else return p[k].data;
        }
        int Treap_pred(int k,int key,int optimal)
        {
            if (!p[k].symbol) return optimal;
            if (p[k].data<=key) return Treap_pred(p[k].rightnode,key,k);
                else return Treap_pred(p[k].leftnode,key,optimal);
        }
        int Treap_succ(int k,int key,int optimal)
        {
            if (!p[k].symbol) return optimal;
            if (p[k].data>=key) return Treap_succ(p[k].leftnode,key,k);
                else return Treap_succ(p[k].rightnode,key,optimal);
        }
};

treap T;
int main()
{
    int n,m;
    #ifdef ALLOW
        MessageBox(NULL,"This program is the standard Treap code\nAbility:Left/Right Rotate,Find the maxnum/minnum,Find the predecessor/successor of a node,Add/Delete nodes\n","Tips",MB_OK);
    #endif 
    printf("Input the total nodes number:\n");
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        int tmp;
        printf("No.%d : You want to insert:",i);
        scanf("%d",&tmp);
        T.Treap_insert(T.root,tmp);
    }

    printf("After inserting,the Treap is:\n");
    T.in_order_print(T.root);
    printf("MAXNUM:     %d\n",T.find_max(T.root));
    printf("MINNUM:     %d\n",T.find_min(T.root));
    #ifdef query_pred_succ
        printf("How many nodes do you want to look for its predecessor/successor?\n");
        scanf("%d",&m);
        if (m>0)
        {
            printf("Input format for looking for the predecessor:P num\n");
            printf("Input format for looking for the successor  :S num\n");
            char cmd;
            int tmp;
            int a=1;
            while (a<=n)
            {
                cin>>cmd>>tmp;
                if (cmd=='P') printf("%d\n",T.Treap_pred(T.root,tmp,0));
                    else if (cmd=='S') printf("%d\n",T.Treap_succ(T.root,tmp,0));
                        else MessageBox(NULL,"Unknown Command Type\nPlease Input Again.","Error",MB_OK),a--;
                a++;
            }
        }
    #endif
    #ifdef query_delete
        printf("How many nodes would you like to delete?(The number you input must be below%d)\n",n);
        scanf("%d",&m);
        if (m>n) 
        {
            MessageBox(NULL,"The number you inputed just now is too big!!!","Error",MB_OK);
            return -1;
        }
        for (int i=1;i<=m;i++)
        {
            int tmp;
            printf("No.%d : You want to delete the node with value",i);
            scanf("%d",&tmp);
            T.Treap_delete(T.root,tmp);
            T.in_order_print(T.root);
        }
    #endif
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

BZOJ 3224 普通平衡树 裸treap模板题

题意: (裸题还用我说么) 方法: (裸题还用我说么) 解析: 第一次写treap还是费点劲的尤其在理解的时候 首先,定义如下 struct data { int l , r , v ...
  • wzq_QwQ
  • wzq_QwQ
  • 2015年03月19日 19:41
  • 1880

Treap模板(简单版)

支持: 插入 删除 查找 最大值 最小值 (不支持重复元素) 代码:#include #include #include #include #include #include #incl...
  • cym19981017
  • cym19981017
  • 2016年06月10日 23:42
  • 714

【算法】Treap模板和SBT模板

SBT:http://blog.csdn.net/acceptedxukai/article/details/6921334 Treap:来源忘了。 有个可以优化的地方,就是将相同值合并为...
  • CHCXCHC
  • CHCXCHC
  • 2015年08月22日 15:13
  • 1288

平衡树Treap模版

自己总结的一个平衡树Treap模版,自己测试了一下,感觉没什么错误,但总感觉有bug,请大家指教一下,下面是自己测试时写的测试用的代码,请无视#include #include #include ...
  • Dan__ge
  • Dan__ge
  • 2016年03月17日 19:28
  • 945

BZOJ 1208 平衡树Treap模版题

点击打开链接 题意:不描述了 思路:我们只需要一个树就可以,输入一个数就存进去,当人和动物都大于0的时候,开始给人分配宠物,人的期望值b的排名k,找到k-1的数和k+1的数,比较哪个离b更近,人多...
  • Dan__ge
  • Dan__ge
  • 2016年04月30日 18:10
  • 3383

静态数组实现TREAP

#include #include struct node{ int x,w,h,r,l; }; struct node a[10001]; int e; void rotate_left(int...
  • cnyali
  • cnyali
  • 2015年02月06日 11:44
  • 611

Treap(树堆)图解与实现

前面我们介绍了AVL树,伸展树,它们都是二叉搜索树,二叉搜索树的主要问题就是其结构与数据相关,树的深度可能会很大,Treap树就是一种解决二叉搜索树可能深度过大的另一种数据结构。 Treap=Tre...
  • u014634338
  • u014634338
  • 2015年11月03日 19:30
  • 2760

UVA 12538 可持久化treap入门

还新学了能可持久化的treap 看了一下clj的《可持久化数据结构研究》论文。 做了一下UVA 12538,算是会了一点点了。 可持久化treap不用进行rotate操作,它有两个基本的操作 mer...
  • c3568
  • c3568
  • 2014年01月19日 22:35
  • 2285

查找——图文翔解Treap(树堆)

Treap=Tree+Heap。Treap本身是一棵二叉搜索树,它的左子树和右子树也分别是一个Treap,和一般的二叉搜索树不同的是,Treap纪录一个额外的数据,就是优先级。Treap在以关键码构成...
  • yang_yulei
  • yang_yulei
  • 2015年06月04日 00:04
  • 10384

Treap模板(第K大,插入删除查找)

#include #include #include #include #include //By sssSSSay //On 2017 . 2 . 6 //Today White Eve ...
  • sssSSSay
  • sssSSSay
  • 2017年02月07日 07:13
  • 285
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Treap标准模板
举报原因:
原因补充:

(最多只允许输入30个字)