poj 3841 Double Queue (AVL树入门)
- /******************************************************************
- 题目: Double Queue(poj 3481)
- 链接: http://poj.org/problem?id=3481
- 算法: avl树(入门)
- *******************************************************************/
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- typedef struct Node ///树的节点
- {
- int val,data;
- int h; ///以当前结点为根结点的数的高度
- int bf; ///平衡因子(左子树高度与右子树高度之差)
- Node *left,*right;
- }Node;
- class AvlTree ///alv树,树中太多函数,用类来实现容易一些
- {
- private:
- Node *root; ///树的根节点
- public:
- void Init() ///初始化树
- {
- root=NULL;
- }
- int Height(Node *T) ///取一个节点的高度
- {
- if (T==NULL) return ;
- return T->h;
- }
- int Bf(Node *T) ///计算一个节点的平衡因子
- {
- if (T->left==T->right) return ;
- if (T->left==NULL) return -(T->right->h); ///这里一定取负数(左子树高度与右子树高度之差)
- if (T->right==NULL) return T->left->h;
- return (T->left->h)-(T->right->h);
- }
- ///四种旋转,不知为什么,自己多画一下就知道了。
- Node *LL_rotate(Node *T) ///单向右旋平衡处理LL:由于在*T的左子树根结点的左子树上插入结点
- {
- Node *B=T->left;
- T->left=B->right;
- B->right=T;
- T->h=max(Height(T->left),Height(T->right))+;
- B->h=max(Height(B->left),Height(T->right))+;
- T->bf=Bf(T);
- B->bf=Bf(B);
- return B;
- }
- Node *RR_rotate(Node *T) ///单向左旋平衡处理RR:由于在*T的右子树根结点的右子树上插入结点
- {
- Node *B=T->right;
- T->right=B->left;
- B->left=T;
- T->h=max(Height(T->left),Height(T->right))+;
- B->h=max(Height(B->left),Height(T->right))+;
- T->bf=Bf(T);
- B->bf=Bf(B);
- return B;
- }
- Node *LR_rotate(Node *T) ///双向旋转平衡处理LR:由于在*T的左子树根结点的右子树上插入结点
- {
- T->left=RR_rotate(T->left);
- T=LL_rotate(T);
- return T;
- }
- Node *RL_rotate(Node *T) ///双向旋转平衡处理RL:由于在*T的右子树根结点的左子树上插入结点
- {
- T->right=LL_rotate(T->right);
- T=RR_rotate(T);
- return T;
- }
- void Insert(int v,int e) ///root是private,所以不能从主函数传入
- {
- Insert(root,v,e);
- }
- void Insert(Node *&T,int v,int e) ///插入新节点
- {
- if (T==NULL)
- {
- T=(Node *)malloc(sizeof(Node));
- T->h=;
- T->bf=;
- T->val=v;
- T->data=e;
- T->left=T->right=NULL;
- return ;
- }
- if (e<T->data) Insert(T->left,v,e);
- else Insert(T->right,v,e);
- T->h=max(Height(T->left),Height(T->right))+; ///计算节点高度
- T->bf=Bf(T); ///计算平衡因子
- if (T->bf>||T->bf<-) ///调整平衡,四种调整反法
- {
- if (T->bf>&&T->left->bf>) T=LL_rotate(T); ///如果T->bf > 1 则肯定有左儿子
- if (T->bf<-&&T->right->bf<) T=RR_rotate(T); ///如果T->bf < -1 则肯定有右儿子
- if (T->bf>1&&T->left->bf<0) T=LR_rotate(T);
- if (T->bf<-1&&T->right>0) T=RL_rotate(T);
- }
- }
- void Find(int flag) ///flag=1为找最大值,否则找最小值
- {
- if (root==NULL)
- {
- printf("0\n");
- return ;
- }
- Node *temp=root;
- if (flag) ///最大值一定最右边
- {
- while (temp->right)
- temp=temp->right;
- }
- else
- {
- while (temp->left)
- temp=temp->left;
- }
- printf("%d\n",temp->val);
- Delete(root,temp->data); ///删除相应节点
- }
- void Delete(Node *&T,int e)
- {
- if (T==NULL) return ;
- if (e<T->data) Delete(T->left,e);
- else if (e>T->data) Delete(T->right,e);
- else ///找到删除的节点
- {
- if (T->left&&T->right) ///删除的节点左右都还有节点
- {
- Node *temp=T->left; ///把左子树的最大值当做当前节点
- while (temp->right) temp=temp->right; ///找最大值
- T->val=temp->val;
- T->data=temp->data;
- Delete(T->left,temp->data); ///左子树最大值已近改为当前根节点,应该删除原来位置
- }
- else
- {
- Node *temp=T;
- if (T->left) T=T->left; ///删除节点只存在左子树
- else if (T->right) T=T->right; ///删除节点只有右子树
- else ///删除节点没有孩子
- {
- free(T);
- T=NULL;
- }
- if (T) free(temp);
- return ;
- }
- }
- T->h=max(Height(T->left),Height(T->right))+;
- T->bf=Bf(T);
- if (T->bf>||T->bf<-) ///删除后一定要调整
- {
- if (T->bf>&&T->left->bf>) T=LL_rotate(T);
- if (T->bf<-&&T->right->bf<) T=RR_rotate(T);
- if (T->bf>&&T->left->bf<) T=LR_rotate(T);
- if (T->bf<-&&T->right>) T=RL_rotate(T);
- }
- }
- void Free() ///由于内存是malloc出来的,最后一定要释放
- {
- FreeNode(root);
- }
- void FreeNode(Node *T)
- {
- if (T==NULL) return ;
- if (T->right) FreeNode(T->right);
- if (T->left) FreeNode(T->left);
- free(T);
- }
- };
- AvlTree T;
- int main()
- {
- T.Init();
- int op;
- while (~scanf("%d",&op)&&op)
- {
- if (op==)
- {
- int v,e;
- scanf("%d%d",&v,&e);
- T.Insert(v,e);
- }
- if (op==)
- {
- T.Find();
- }
- if (op==)
- {
- T.Find();
- }
- }
- T.Free();
- return ;
- }
poj 3841 Double Queue (AVL树入门)的更多相关文章
- POJ 3481 Double Queue STLmap和set新学到的一点用法
2013-08-08 POJ 3481 Double Queue 这个题应该是STL里较简单的吧,用平衡二叉树也可以做,但是自己掌握不够- -,开始想用两个优先队列,一个从大到小,一个从小到大,可是 ...
- POJ 3481 Double Queue(Treap模板题)
Double Queue Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15786 Accepted: 6998 Des ...
- POJ-3481 Double Queue,Treap树和set花式水过!
Double Queue 本打算学二叉树,单纯的二叉树感觉也就那几种遍历了, 无意中看到了这个题,然后就 ...
- POJ 3481 Double Queue(STL)
题意 模拟银行的排队系统 有三种操作 1-加入优先级为p 编号为k的人到队列 2-服务当前优先级最大的 3-服务当前优先级最小的 0-退出系统 能够用stl中的map 由于map本身 ...
- POJ 3481 Double Queue(set实现)
Double Queue The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Buchares ...
- poj 2104 K-th Number (划分树入门 或者 主席树入门)
题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<alg ...
- POJ 3481 Double Queue
平衡树.. 熟悉些fhq-Treap,为啥我在poj读入优化不能用啊 #include <iostream> #include <cstdio> #include <ct ...
- POJ 3481 Double Queue (treap模板)
Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest ...
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...
随机推荐
- CSS 分组
选择器分组 假设希望 h2 元素和段落都有灰色.为达到这个目的,最容易的做法是使用以下声明: h2, p {color:gray;} 将 h2 和 p 选择器放在规则左边,然后用逗号分隔,就定义了一个 ...
- IOS开发-封装数据库sqlite3之为何选择FMDB
为什么使用第三方轻量级框架FMDB? FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语 ...
- 【python】模块作用域
作用域 在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用.在Python中,是通过_前缀来实现的. 类似_xxx和__xxx这样 ...
- Java 二进制与十六进制转换
Java 二进制与十六进制转换 二进制转换十六进制 /** * @description 将二进制转换成16进制 * * @param buf * @return */ public static S ...
- mysql按照中文名称排序
mysql按照中文名称排序 Sql代码 www.2cto.com /* Navicat MySQL Data Transfer Source Server : ...
- PCL还是SAP?
When you first created the Hello solution in Visual Studio, you had a choice of two application temp ...
- C++模板元编程 - 函数重载决议选择工具(不知道起什么好名)完成
这个还是基于之前实现的那个MultiState,为了实现三种类型“大类”的函数重载决议:所有整数.所有浮点数.字符串,分别将这三种“大类”的数据分配到对应的Converter上. 为此实现了一些方便的 ...
- const,static,volatile
1.static 作用 在C语言中,关键字static有三个明显的作用:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.2). 在模块内(但在函数体外),一个被声明为静态的 ...
- Tomcat 使用apr优化
最近业务服务器出现了一些问题,Nginx傲娇了,准备把加Nginx插件上的一些处理逻辑扔到后端的Tomcat的业务处理里面去,考虑到tomcat目前本来就压力山大,所以弄了弄apr库来优化tomcat ...
- EF框架 转载
http://www.cnblogs.com/zrdm/p/5060360.html Model First Model First我们称之为"模型优先",这里的模型指的是&quo ...