1. /******************************************************************
  2. 题目: Double Queue(poj 3481)
  3. 链接: http://poj.org/problem?id=3481
  4. 算法: avl树(入门)
  5. *******************************************************************/
  6. #include<cstdio>
  7. #include<cstring>
  8. #include<cstdlib>
  9. #include<iostream>
  10. #include<algorithm>
  11. using namespace std;
  12.  
  13. typedef struct Node ///树的节点
  14. {
  15. int val,data;
  16. int h; ///以当前结点为根结点的数的高度
  17. int bf; ///平衡因子(左子树高度与右子树高度之差)
  18. Node *left,*right;
  19. }Node;
  20.  
  21. class AvlTree ///alv树,树中太多函数,用类来实现容易一些
  22. {
  23. private:
  24. Node *root; ///树的根节点
  25. public:
  26. void Init() ///初始化树
  27. {
  28. root=NULL;
  29. }
  30. int Height(Node *T) ///取一个节点的高度
  31. {
  32. if (T==NULL) return ;
  33. return T->h;
  34. }
  35. int Bf(Node *T) ///计算一个节点的平衡因子
  36. {
  37. if (T->left==T->right) return ;
  38. if (T->left==NULL) return -(T->right->h); ///这里一定取负数(左子树高度与右子树高度之差)
  39. if (T->right==NULL) return T->left->h;
  40. return (T->left->h)-(T->right->h);
  41. }
  42. ///四种旋转,不知为什么,自己多画一下就知道了。
  43. Node *LL_rotate(Node *T) ///单向右旋平衡处理LL:由于在*T的左子树根结点的左子树上插入结点
  44. {
  45. Node *B=T->left;
  46. T->left=B->right;
  47. B->right=T;
  48. T->h=max(Height(T->left),Height(T->right))+;
  49. B->h=max(Height(B->left),Height(T->right))+;
  50. T->bf=Bf(T);
  51. B->bf=Bf(B);
  52. return B;
  53. }
  54. Node *RR_rotate(Node *T) ///单向左旋平衡处理RR:由于在*T的右子树根结点的右子树上插入结点
  55. {
  56. Node *B=T->right;
  57. T->right=B->left;
  58. B->left=T;
  59. T->h=max(Height(T->left),Height(T->right))+;
  60. B->h=max(Height(B->left),Height(T->right))+;
  61. T->bf=Bf(T);
  62. B->bf=Bf(B);
  63. return B;
  64. }
  65. Node *LR_rotate(Node *T) ///双向旋转平衡处理LR:由于在*T的左子树根结点的右子树上插入结点
  66. {
  67. T->left=RR_rotate(T->left);
  68. T=LL_rotate(T);
  69. return T;
  70. }
  71. Node *RL_rotate(Node *T) ///双向旋转平衡处理RL:由于在*T的右子树根结点的左子树上插入结点
  72. {
  73. T->right=LL_rotate(T->right);
  74. T=RR_rotate(T);
  75. return T;
  76. }
  77. void Insert(int v,int e) ///root是private,所以不能从主函数传入
  78. {
  79. Insert(root,v,e);
  80. }
  81. void Insert(Node *&T,int v,int e) ///插入新节点
  82. {
  83. if (T==NULL)
  84. {
  85. T=(Node *)malloc(sizeof(Node));
  86. T->h=;
  87. T->bf=;
  88. T->val=v;
  89. T->data=e;
  90. T->left=T->right=NULL;
  91. return ;
  92. }
  93. if (e<T->data) Insert(T->left,v,e);
  94. else Insert(T->right,v,e);
  95. T->h=max(Height(T->left),Height(T->right))+; ///计算节点高度
  96. T->bf=Bf(T); ///计算平衡因子
  97. if (T->bf>||T->bf<-) ///调整平衡,四种调整反法
  98. {
  99. if (T->bf>&&T->left->bf>) T=LL_rotate(T); ///如果T->bf > 1 则肯定有左儿子
  100. if (T->bf<-&&T->right->bf<) T=RR_rotate(T); ///如果T->bf < -1 则肯定有右儿子
  101. if (T->bf>1&&T->left->bf<0) T=LR_rotate(T);
  102. if (T->bf<-1&&T->right>0) T=RL_rotate(T);
  103. }
  104. }
  105. void Find(int flag) ///flag=1为找最大值,否则找最小值
  106. {
  107. if (root==NULL)
  108. {
  109. printf("0\n");
  110. return ;
  111. }
  112. Node *temp=root;
  113. if (flag) ///最大值一定最右边
  114. {
  115. while (temp->right)
  116. temp=temp->right;
  117. }
  118. else
  119. {
  120. while (temp->left)
  121. temp=temp->left;
  122. }
  123. printf("%d\n",temp->val);
  124. Delete(root,temp->data); ///删除相应节点
  125. }
  126. void Delete(Node *&T,int e)
  127. {
  128. if (T==NULL) return ;
  129. if (e<T->data) Delete(T->left,e);
  130. else if (e>T->data) Delete(T->right,e);
  131. else ///找到删除的节点
  132. {
  133. if (T->left&&T->right) ///删除的节点左右都还有节点
  134. {
  135. Node *temp=T->left; ///把左子树的最大值当做当前节点
  136. while (temp->right) temp=temp->right; ///找最大值
  137. T->val=temp->val;
  138. T->data=temp->data;
  139. Delete(T->left,temp->data); ///左子树最大值已近改为当前根节点,应该删除原来位置
  140. }
  141. else
  142. {
  143. Node *temp=T;
  144. if (T->left) T=T->left; ///删除节点只存在左子树
  145. else if (T->right) T=T->right; ///删除节点只有右子树
  146. else ///删除节点没有孩子
  147. {
  148. free(T);
  149. T=NULL;
  150. }
  151. if (T) free(temp);
  152. return ;
  153. }
  154. }
  155. T->h=max(Height(T->left),Height(T->right))+;
  156. T->bf=Bf(T);
  157. if (T->bf>||T->bf<-) ///删除后一定要调整
  158. {
  159. if (T->bf>&&T->left->bf>) T=LL_rotate(T);
  160. if (T->bf<-&&T->right->bf<) T=RR_rotate(T);
  161. if (T->bf>&&T->left->bf<) T=LR_rotate(T);
  162. if (T->bf<-&&T->right>) T=RL_rotate(T);
  163. }
  164. }
  165. void Free() ///由于内存是malloc出来的,最后一定要释放
  166. {
  167. FreeNode(root);
  168. }
  169. void FreeNode(Node *T)
  170. {
  171. if (T==NULL) return ;
  172. if (T->right) FreeNode(T->right);
  173. if (T->left) FreeNode(T->left);
  174. free(T);
  175. }
  176. };
  177. AvlTree T;
  178.  
  179. int main()
  180. {
  181. T.Init();
  182. int op;
  183. while (~scanf("%d",&op)&&op)
  184. {
  185. if (op==)
  186. {
  187. int v,e;
  188. scanf("%d%d",&v,&e);
  189. T.Insert(v,e);
  190. }
  191. if (op==)
  192. {
  193. T.Find();
  194. }
  195. if (op==)
  196. {
  197. T.Find();
  198. }
  199. }
  200. T.Free();
  201. return ;
  202. }

poj 3841 Double Queue (AVL树入门)的更多相关文章

  1. POJ 3481 Double Queue STLmap和set新学到的一点用法

    2013-08-08 POJ 3481  Double Queue 这个题应该是STL里较简单的吧,用平衡二叉树也可以做,但是自己掌握不够- -,开始想用两个优先队列,一个从大到小,一个从小到大,可是 ...

  2. POJ 3481 Double Queue(Treap模板题)

    Double Queue Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15786   Accepted: 6998 Des ...

  3. POJ-3481 Double Queue,Treap树和set花式水过!

                                                    Double Queue 本打算学二叉树,单纯的二叉树感觉也就那几种遍历了, 无意中看到了这个题,然后就 ...

  4. POJ 3481 Double Queue(STL)

    题意  模拟银行的排队系统  有三种操作  1-加入优先级为p 编号为k的人到队列  2-服务当前优先级最大的   3-服务当前优先级最小的  0-退出系统 能够用stl中的map   由于map本身 ...

  5. POJ 3481 Double Queue(set实现)

    Double Queue The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Buchares ...

  6. poj 2104 K-th Number (划分树入门 或者 主席树入门)

    题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<alg ...

  7. POJ 3481 Double Queue

    平衡树.. 熟悉些fhq-Treap,为啥我在poj读入优化不能用啊 #include <iostream> #include <cstdio> #include <ct ...

  8. POJ 3481 Double Queue (treap模板)

    Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest ...

  9. PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

    03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...

随机推荐

  1. CSS 分组

    选择器分组 假设希望 h2 元素和段落都有灰色.为达到这个目的,最容易的做法是使用以下声明: h2, p {color:gray;} 将 h2 和 p 选择器放在规则左边,然后用逗号分隔,就定义了一个 ...

  2. IOS开发-封装数据库sqlite3之为何选择FMDB

    为什么使用第三方轻量级框架FMDB? FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语 ...

  3. 【python】模块作用域

    作用域 在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用.在Python中,是通过_前缀来实现的. 类似_xxx和__xxx这样 ...

  4. Java 二进制与十六进制转换

    Java 二进制与十六进制转换 二进制转换十六进制 /** * @description 将二进制转换成16进制 * * @param buf * @return */ public static S ...

  5. mysql按照中文名称排序

    mysql按照中文名称排序   Sql代码  www.2cto.com   /*   Navicat MySQL Data Transfer      Source Server         : ...

  6. PCL还是SAP?

    When you first created the Hello solution in Visual Studio, you had a choice of two application temp ...

  7. C++模板元编程 - 函数重载决议选择工具(不知道起什么好名)完成

    这个还是基于之前实现的那个MultiState,为了实现三种类型“大类”的函数重载决议:所有整数.所有浮点数.字符串,分别将这三种“大类”的数据分配到对应的Converter上. 为此实现了一些方便的 ...

  8. const,static,volatile

    1.static 作用 在C语言中,关键字static有三个明显的作用:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.2). 在模块内(但在函数体外),一个被声明为静态的 ...

  9. Tomcat 使用apr优化

    最近业务服务器出现了一些问题,Nginx傲娇了,准备把加Nginx插件上的一些处理逻辑扔到后端的Tomcat的业务处理里面去,考虑到tomcat目前本来就压力山大,所以弄了弄apr库来优化tomcat ...

  10. EF框架 转载

    http://www.cnblogs.com/zrdm/p/5060360.html Model First Model First我们称之为"模型优先",这里的模型指的是&quo ...