AcWing 1616. 判断完全 AVL 树
原题链接
中等
作者:
leo123456
,
2020-08-23 13:31:10
,
所有人可见
,
阅读 880
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=30;
int n;
int l[N],r[N],v[N],h[N],idx;
int pos[N];
void update(int u)
{
h[u]=max(h[l[u]],h[r[u]])+1;
}
void R(int& u)
{
int p=l[u];
l[u]=r[p],r[p]=u;
update(u),update(p);
u=p;
}
void L(int& u)
{
int p=r[u];
r[u]=l[p],l[p]=u;
update(u),update(p);
u=p;
}
int get_balance(int u)
{
return h[l[u]]-h[r[u]];
}
void insert(int& u,int w)
{
if(!u)
{
u=++idx;
v[u]=w;
}
else if(w<v[u])
{
insert(l[u],w);
if(get_balance(u)==2)
{
if(get_balance(l[u])==1) R(u);
else L(l[u]),R(u);
}
}
else
{
insert(r[u],w);
if(get_balance(u)==-2)
{
if(get_balance(r[u])==-1) L(u);
else R(r[u]),L(u);
}
}
update(u);
}
bool bfs(int root)
{
queue<int> q;
q.push(root);
pos[root]=1;
bool flag=true;
bool res=true;
while(!q.empty())
{
auto t=q.front();
q.pop();
if(pos[t]>n) res=false;
if(flag)
{
cout<<v[t];
flag=0;
}
else cout<<' '<<v[t];
if(l[t]) q.push(l[t]),pos[l[t]]=pos[t]*2;
if(r[t]) q.push(r[t]),pos[r[t]]=pos[t]*2+1;
}
return res;
}
int main()
{
cin>>n;
int root=0;
for(int i=0;i<n;i++)
{
int w;
cin>>w;
insert(root,w);
}
bool res=bfs(root);
cout<<endl;
if(res) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}