直接套 AVL 树模板。
#include <bits/stdc++.h>
using namespace std;
#define N 200000
struct AVL{
int lc,rc,v,h;
}tree[N+5];
int pos,root;
int right_rotate(int r){
int t = tree[r].lc;
tree[r].lc = tree[t].rc;
tree[t].rc = r;
tree[r].h = max(tree[tree[r].lc].h,tree[tree[r].rc].h)+1;
tree[t].h = max(tree[tree[t].lc].h,tree[tree[t].rc].h)+1;
return t;
}
int left_rotate(int r){
int t = tree[r].rc;
tree[r].rc = tree[t].lc;
tree[t].lc = r;
tree[r].h = max(tree[tree[r].lc].h,tree[tree[r].rc].h)+1;
tree[t].h = max(tree[tree[t].lc].h,tree[tree[t].rc].h)+1;
return t;
}
int right_left_rotate(int r){
tree[r].rc = right_rotate(tree[r].rc);
return left_rotate(r);
}
int left_right_rotate(int r){
tree[r].lc = left_rotate(tree[r].lc);
return right_rotate(r);
}
void maintain(int &r){
if(tree[tree[r].lc].h == tree[tree[r].rc].h+2){ //左子树高了
int t = tree[r].lc;
if(tree[tree[t].lc].h == tree[tree[r].rc].h+1) r = right_rotate(r);//左子树的左儿子,对应第一种情况
else if(tree[tree[t].rc].h == tree[tree[r].rc].h+1) r = left_right_rotate(r);
}
else if(tree[tree[r].rc].h == tree[tree[r].lc].h+2){ //右子树高了
int t = tree[r].rc;
if(tree[tree[t].rc].h == tree[tree[r].lc].h+1) r = left_rotate(r);//右子树的右儿子,对应第四种情况
else if(tree[tree[t].lc].h == tree[tree[r].lc].h+1) r = right_left_rotate(r);
}
tree[r].h = max(tree[tree[r].lc].h,tree[tree[r].rc].h)+1;//高度更新
}
int insert(int r,int x){
if(r == 0){ //找到一个空的节点,赋值
tree[++pos].h = 1;//高度初始化
tree[pos].v = x;
return pos;
}
if(x < tree[r].v) tree[r].lc = insert(tree[r].lc,x);//插入的数小于根节点,因此在它的左子树插入
else if(x > tree[r].v) tree[r].rc = insert(tree[r].rc,x);
maintain(r);//维持节点r的平衡
return r;//返回新的根节点
}
void get(int po,int x){
printf("%d ",tree[po].v);
if(tree[po].v==x){
return;
}else if(tree[po].v<x){
get(tree[po].rc,x);
}else {
get(tree[po].lc,x);
}
}
int main(){
int n; scanf("%d",&n);
for(int i=1;i<=n;++i) {
int op,x; scanf("%d %d",&op,&x);
if(op==1) root=insert(root,x);
else {
get(root,x);
printf("\n");
}
}
return 0;
}