#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
int k=0,n,num;;
struct node
{
int id,height;
node *lchild,*rchild;
};
int getheight(node *root)
{
if(root==NULL)
return 0;
else
return root->height;
}
int getbalancefactor(node *root)
{
return getheight(root->lchild)-getheight(root->rchild);
}
void updateheight(node* root)
{
root->height= max(getheight(root->lchild),getheight(root->rchild))+1;
}
void L(node* &root)
{
node *temp=root->rchild;
root->rchild=temp->lchild;
temp->lchild=root;
updateheight(root);
updateheight(temp);
root=temp;
}
void R(node* &root)
{
node *temp=root->lchild;
root->lchild=temp->rchild;
temp->rchild=root;
updateheight(root);
updateheight(temp);
root=temp;
}
void insert(node* &root,int index)
{
if(root==NULL)
{
root=new node;
root->lchild=NULL;
root->rchild=NULL;
root->id=index;
root->height=1;
return;
}
if(index>=root->id)
{
insert(root->rchild,index);
updateheight(root);
if(getbalancefactor(root)==-2)
{
if(getbalancefactor(root->rchild)==-1)
{
L(root);
}
else if(getbalancefactor(root->rchild)==1)
{
R(root->rchild);
L(root);
}
}
}
else
{
insert(root->lchild,index);
updateheight(root);
if(getbalancefactor(root)==2)
{
if(getbalancefactor(root->lchild)==1)
{
R(root);
}
else if(getbalancefactor(root->lchild)==-1)
{
L(root->lchild);
R(root);
}
}
}
}
void BFS(node* root)
{
queue<node*> q;
q.push(root);
bool isc=true,flag=false;
while(!q.empty())
{
node* temp=q.front();
q.pop();
printf("%d",temp->id);
k++;
if(k!=n)
printf(" ");
else
printf("\n");
if(temp->lchild!=NULL)
{
if(flag)
{
isc=false;
}
q.push(temp->lchild);
}
else
{
flag=true;
}
if(temp->rchild!=NULL)
{
if(flag)
{
isc=false;
}
q.push(temp->rchild);
}
else
{
flag=true;
}
}
if(isc)
printf("YES\n");
else
printf("NO\n");
}
int main()
{
cin>>n;
node *root=NULL;
for(int i=0;i<n;i++)
{
scanf("%d",&num);
insert(root,num);
}
BFS(root);
}
07-20
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交