//下面是我手写的AVL树
/*
@
@ —–> LL(我觉的是左偏,分不清楚到底叫法叫什么了)
@
@
@——> RR
@
@
@—–> LR
@
@
@ —–> RL(从最下面开始往上旋转,反正最后将最下面的那个节点移到了最上面
@
*/
#include <bits/stdc++.h>
using namespace std;
int n;//素组的个数
int a[100];
typedef struct NODE
{
NODE*left;
NODE*right;
int val;
int height;
int getHeight()//这个地方是需要节点的高度的,因为要计算bf平衡因子
{
if(this==NULL)
{
return 0;
}
else
{
return this->height=max(this->left->getHeight(),this->right->getHeight())+1;
}
}
NODE(int value)//构造函数
{
left=NULL;
right=NULL;
val=value;
height=0;
}
}node;
//我看过网上的别人的代码,大致有两种写法,一种是返回指针的形式,
//另一种是指针的引用,指针的引用我搞不清楚,不知道最后那个父指针是怎么连上去的
//所以采用返回指针的形式
node*LL(node*root)
{//这个地方旋转之后其实,root的值已经变了,
node*temp=root->left;//这个地方理解就很好写了
root->left=temp->right;
temp->right=root;
return temp;
}
//RR其实和LL刚好相反
node*RR(node*root)
{
node*temp=root->right;
root->right=temp->left;
temp->left=root;
return temp;
}//对称的,left变right,right变left
node*Insert(node*root,int value)
{
if(root==NULL)
{//这样写,就不用先插入一个节点,一次性处理所有的节点
root=new node(value);//最下面有染回root
}
else
{
if(value<root->val)
{
root->left=Insert(root->left,value);//传进去谁的值,就返回谁的值
if(root->left->getHeight()-root->right->getHeight()==2)
{//这个地方得自己意会了
if(value<root->left->val)
{
root=LL(root);
}
else
{
root->left=RR(root->left);//两个地方平移的位置也不一样
root=LL(root);//与之前那个是烦的
}
}
}
else
{
root->right=Insert(root->right,value);
if(root->right->getHeight()-root->left->getHeight()==2)
{
if(value>root->right->val)
{
root=RR(root);
}
else
{
root->right=LL(root->right);
root=RR(root);
}
}
}
}
return root;//这里写返回root;
}
void inOrder(node*root)
{
if(root==NULL)
{
return;
}
else
{
inOrder(root->left);
cout <<root->val<<” “;
inOrder(root->right);
}
}
void levelOrder(node*root)
{
queue<node*>que;
que.push(root);
int temp;
node*p=NULL;
while(!que.empty())
{
p=que.front();
que.pop();
cout <<p->val<<” “;
if(p->left!=NULL)
{
que.push(p->left);
}
if(p->right!=NULL)
{
que.push(p->right);
}
}
}
int main(void)
{
cin>>n;
NODE*root=NULL;
for(int i=0;i<n;++i)
{
cin>>a[i];
root=Insert(root,a[i]);
}
// inOrder(root);
levelOrder(root);
return 0;
}