AVL模板
感谢此博客
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define de(x) cout << #x << " = " << x << endl
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 15;
struct AvlTree
{
int val;
int ch[2];
int hei, sz;
/*node( int _v, int _h, int _sz )
{
val = _v;
hei = _h;
sz = _sz;
ch[0] = ch[1] = 0;
}*/
};
AvlTree t[N<<2];
int cnt, rt;
void node( AvlTree &x, int v, int _h, int _sz )
{
x.val = v;
x.hei = _h;
x.sz = _sz;
x.ch[0] = x.ch[1] = 0;
}
int height( int x )
{
if ( !x ) return -1;
else
return t[x].hei;
}
int rotate( int x, int f )
{
int y = t[x].ch[f^1];
t[x].ch[f^1] = t[y].ch[f];
t[y].ch[f] = x;
t[x].hei = max( height(t[x].ch[0]), height(t[x].ch[1]) ) + 1;
t[y].hei = max( height(t[y].ch[0]), height(t[y].ch[1]) ) + 1;
return y;
}
int doubleL2R( int x )
{
t[x].ch[0] = rotate( t[x].ch[0], 0 );
return rotate( x, 1 );
}
int doubleR2L( int x )
{
t[x].ch[1] = rotate( t[x].ch[1], 1 );
return rotate( x, 0 );
}
void ins( int &x, int v )
{
if ( !x ) node( t[x=cnt++], v, 0, 0);
else if ( v < t[x].val )
{
ins( t[x].ch[0], v );
if ( height(t[x].ch[0]) - height(t[x].ch[1]) == 2 )
{
int f = v < t[t[x].ch[0]].val;
if ( f )
x = rotate( x, f );
else
x = doubleL2R( x );
}
}
else if ( v > t[x].val )
{
ins( t[x].ch[1], v );
if ( height(t[x].ch[1]) - height(t[x].ch[0]) == 2 )
{
int f = v > t[t[x].ch[1]].val;
if ( f )
x = rotate( x, f^1 );
else
x = doubleR2L( x );
}
}
t[x].hei = max( height(t[x].ch[0]), height(t[x].ch[1]) ) + 1;
}
void find( int x, int v )
{
if ( !x ) return ;
if ( t[x].val == v ) return ;
printf("%d ", t[x].val );
find( t[x].ch[ v > t[x].val ], v );
}
void init()
{
cnt = 1;
rt = 0;
node( t[rt], 0, 0, 0 );
}
int main()
{
int n;
init();
scanf("%d", &n);
for ( int i = 0; i < n; i ++ )
{
int op, now;
scanf("%d%d", &op, &now);
if ( op == 1 ) ins( rt, now );
else
{
find( rt, now );
printf("%d\n", now);
}
}
return 0;
}
AVL模板的更多相关文章
- PAT甲级1123 Is It a Complete AVL Tree【AVL树】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805351302414336 题意: 给定n个树,依次插入一棵AVL ...
- Codeforces Round #353 (Div. 2) D. Tree Construction 二叉搜索树
题目链接: http://codeforces.com/contest/675/problem/D 题意: 给你一系列点,叫你构造二叉搜索树,并且按输入顺序输出除根节点以外的所有节点的父亲. 题解: ...
- PAT 甲级真题题解(63-120)
2019/4/3 1063 Set Similarity n个序列分别先放进集合里去重.在询问的时候,遍历A集合中每个数,判断下该数在B集合中是否存在,统计存在个数(分子),分母就是两个集合大小减去分 ...
- 数据结构图文解析之:AVL树详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- AVL树模板
///AVL树模板 typedef struct Node ///树的节点 { int val,data; int h; ///以当前结点为根结点的数的高度 int bf; ///平衡因子(左子树高度 ...
- 平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】
平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是 ...
- PAT甲级题解-1066. Root of AVL Tree (25)-AVL树模板题
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6803291.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- C++模板实现的AVL树
1 AVL树的定义 AVL树是一种自平衡二叉排序树.它的特点是不论什么一个节点的左子树高度和右子树的高度差在-1,0,1三者之间. AVL树的不论什么一个子树都是AVL树. 2 AVL树的实现 AVL ...
- 【PAT甲级】1066 Root of AVL Tree (25 分)(AVL树建树模板)
题意: 输入一个正整数N(<=20),接着输入N个结点的值,依次插入一颗AVL树,输出最终根结点的值. AAAAAccepted code: #define HAVE_STRUCT_TIMESP ...
随机推荐
- qt model view 编程总结
看不见的root的 QModelIndex() 是 无效的 list 和table 的index 函数中的parent参数就只要 root QModelIndex 就可以,因为没有层级概念 Model ...
- webPage logService 日志服务 剥离
[旧的场景]1.x.a.com指向负载均衡服务器ipL;2.代码所在的应用服务器ipA,ipB,ipC,运行nginx-phpFPM服务,提供2个服务: 2.1.应用服务器ipA,ipB,ipC中we ...
- 解决Bat脚本中包含中文,运行乱码
bat文件右键用“编辑” 打开, 另存为时,UTF-8保存为ANSI 格式.即可解决运行时乱码问题.
- OCR技术浅探: 语言模型和综合评估(4)
语言模型 由于图像质量等原因,性能再好的识别模型,都会有识别错误的可能性,为了减少识别错误率,可以将识别问题跟统计语言模型结合起来,通过动态规划的方法给出最优的识别结果.这是改进OCR识别效果的重要方 ...
- 2D游戏中的碰撞检测:圆形与矩形碰撞检测(Javascrip版)
一,原理介绍 这回有点复杂,不过看懂了还是很好理解的.当然,我不敢保证这种算法在任何情况下都会起效果,如果有同学测试时,发现出现错误,请及时联系我. 我们首先来建立一个以圆心为原点的坐标系: 然后要检 ...
- python学习笔记(七)操作mysql
python操作mysql数据库需要先安装pymysql模块,在之前博客中可翻看如何安装,最简单的就是pip install pymysql 1.导入pymysql模块 import pymysq ...
- 脚本其实很简单-windows配置核查程序(2)
bat脚本是什么? 首先讲讲什么是命令行,在windows操作系统中,点击左下角的win图标,直接输入cmd搜索,左键点击进入命令行模式(或按键盘上的win键+r直接调出来命令行窗口). 在windo ...
- 编辑器——vscode
1.编辑器个人工作配置 // 将设置放入此文件中以覆盖默认设置 { "editor.tabSize": 2, "workbench.iconTheme": &q ...
- 微信公众号JSAPI支付
微信公众号JSAPI支付 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.config.php中填入配置账户信息; 二:设置授权 开发者中心-&g ...
- 无线路由MAC地址过滤安全可靠性讨论
无线路由MAC地址过滤安全可靠性讨论/如何实现,真的有效吗,如何防范 [内容导航] 什么是MAC地址过滤 突破MAC地址过滤步骤 捕获的无线客户端MAC地址 更改MAC地址来伪造身份 在W ...