• treap树模板


     1 ///treap树模板
     2 typedef struct Node    ///节点的结构体
     3 {
     4     Node *l,*r;
     5     int val,pri;      ///节点的值和优先级
     6     int sz;           ///节点子树的节点数
     7     Node(int x)       ///初始化节点
     8     {
     9         l=r=NULL;
    10         val=x;
    11         pri=rand();
    12         sz=1;
    13     }
    14 }Node;
    15 Node *root;
    16 
    17 int Tsize(Node *T)  ///计算子树的叶子节点
    18 {
    19     if (T==NULL) return 0;
    20     return T->sz;
    21 }
    22 Node *L_rotate(Node *T)    ///右节点的优先级大于当前节点的优先级,进行左旋转
    23 {
    24     Node *A=T->r;         ///A表示有节点
    25     T->r=A->l;
    26     A->l=T;
    27     A->sz-T->sz;         ///交换后A变成当前节点,所以它的子树的节点数等于原来节点的节点数
    28     T->sz=Tsize(T->l)+Tsize(T->r)+1;
    29     return A;
    30 }
    31 Node *R_rotate(Node *T)   ///左节点的优先级大于当前节点的优先级,进行右旋转
    32 {
    33     Node *A=T->l;
    34     T->l=A->r;
    35     A->r=T;
    36     A->sz=T->sz;
    37     T->sz=Tsize(T->l)+Tsize(T->r)+1;
    38     return A;
    39 }
    40 
    41 void inser(Node *&T,int val) ///插入函数,和二叉排序树差不多
    42 {
    43     if (T==NULL)            
    44     {
    45         T=new Node(val);
    46         return ;
    47     }
    48     if (T->val>=val)
    49     {
    50         inser(T->l,val);
    51         if ((T->l->pri)<(T->pri)) T=R_rotate(T); ///优先级比较,并旋转
    52     }
    53     else
    54     {
    55         inser(T->r,val);
    56         if ((T->r->pri)<(T->pri)) T=L_rotate(T);
    57     }
    58     T->sz=Tsize(T->l)+Tsize(T->r)+1;   
    59 }
    60 
    61 void Delete(Node *&T,int val)        ///删除函数
    62 {
    63     if (T->val>val) Delete(T->l,val);
    64     else if (T->val<val) Delete(T->r,val);
    65     else
    66     {
    67         if (T->l==NULL&&T->r==NULL) T=NULL;   ///左右节点都为空
    68         else if (T->r==NULL) T=T->l;          ///右节点为空
    69         else if(T->l==NULL) T=T->r;           ///左节点为空
    70         else                                  ///左右都不空
    71         {
    72             if (T->l->pri<T->r->pri)          ///左节点优先级小于右边
    73             {                                 ///右旋转,并向右子树删除
    74                 T=R_rotate(T);                ///应为有旋转后,要删除的节点到有子树去了
    75                 Delete(T->r,val);
    76             }
    77             else
    78             {
    79                 T=L_rotate(T);
    80                 Delete(T->l,val);
    81             }
    82         }
    83     }
    84     if (T!=NULL)
    85     {
    86         T->sz=Tsize(T->l)+Tsize(T->r)+1;
    87     }
    88 }
    89 
    90 int Find(Node *T,int k)                      ///查找第k小的树
    91 {
    92     int temp=Tsize(T->l)+1;                  ///temp小于等于T->val数的个数
    93     if (temp==k) return T->val;
    94     if (temp>k) return Find(T->l,k);
    95     return Find(T->r,k-temp);
    96 }
  • 相关阅读:
    5.4 类型转换
    IntelliJ IDEA 创建Web项目(全教程)
    Spring IoC 依赖注入的方法大全 XML配置方式
    20秒教你如何写maven2的pom文件的依赖包
    数据库面试题之COUNT(*),COUNT(字段),CONUT(DISTINCT 字段)的区别
    Oracle中的单行函数
    Select 子句后的别名,在where条件中不能使用
    Oracle SQL*Plus命令
    使用js请求Servlet时的路径
    idea 创建运行web项目时,报错: Can not issue executeUpdate() for SELECTs解决方案
  • 原文地址:https://www.cnblogs.com/pblr/p/5768538.html
Copyright © 2020-2023  润新知