treap
来源:互联网 发布:最好的围棋软件 编辑:程序博客网 时间:2024/05/21 22:44
#include<iostream>#include<cstdlib>using namespace std;template<typename T>class Node{public: T data; int fix; int amount; Node *left,*right; Node() { left=right=NULL; amount=0; } Node(T d) { data=d; fix=rand(); amount=1; left=right=NULL; }};template<typename T>class Treap{private: Node<T> *root; void l_rotate(Node<T> *&r) { Node<T> *p=r->right; r->right=p->left; p->left=r; r=p; } void r_rotate(Node<T> *&r) { Node<T> *p=r->left; r->left=p->right; p->right=r; r=p; } void _insert(Node<T> *&r,T d) { if(r==NULL)r=new Node<T>(d); else if(r->data==d)r->amount++; else if(r->data > d) { _insert(r->left,d); if(r->fix > r->left->fix)r_rotate(r); } else if(r->data < d) { _insert(r->right,d); if(r->fix > r->right->fix)l_rotate(r); } } int _find(Node<T> *&r,T d) { if(r==NULL)return 0; if(r->data == d)return r->amount; else if(r->data > d)return _find(r->left,d); else if(r->data < d)return _find(r->right,d); } void del(Node<T> *&r) { if(r->left==NULL&&r->right==NULL) { delete r; r=NULL; } else if(r->left==NULL) { Node<T> *p=r; r=r->right; delete p; } else if(r->right==NULL) { Node<T> *p=r; r=r->left; delete p; } else { if(r->left->fix < r->right->fix) { r_rotate(r); del(r->right); } else { l_rotate(r); del(r->left); } } } bool _remove(Node<T> *&r,T d) { if(r==NULL)return false; else if(r->data > d)return _remove(r->left,d); else if(r->data < d)return _remove(r->right,d); r->amount--; if(r->amount == 0)del(r); return true; } void _clear(Node<T> *r) { if(r==NULL)return; _clear(r->left); _clear(r->right); delete r; }public: Treap() { root=NULL; } ~Treap() { _clear(root); } void insert(T data) { _insert(root,data); } int find(T data) { return _find(root,data); } bool remove(T data) { return _remove(root,data); } void clear() { _clear(root); }};
0 0
- Treap
- Treap
- Treap
- Treap
- Treap
- Treap
- treap
- Treap
- treap
- Treap
- treap
- Treap
- Treap
- treap
- Treap
- Treap
- Treap
- Treap
- Xcode 5 单元测试(二)OCMock和GHUnit
- 飞鸽传书如何在VMware下进行通信
- javaweb07-xml
- LA6262 Darts 浮点数处理
- 设计模式系列课程04之【里氏替换原则】
- treap
- [android lib]Android开源项目汇总-备用
- JavaScript中函数声明优先于变量声明
- CF:Problem 427C - Checkposts强连通Tarjan算法
- Android对SQLite批量添加数据
- Linux C 弹球游戏
- platform 总线
- 船_DP
- 不是技术牛人,如何拿到国内IT巨头的Offer