題意:
給你n個點的序列,讓你建一個平衡二叉樹,並判斷這個平衡二叉樹是否是完全二叉樹,並輸出其層次遍歷.
思路:
AVL樹的插入旋轉見: 點擊
完全二叉樹的判斷:繼續點擊
此題不過是二者的結合罷了.
#include<bits/stdc++.h>
using namespace std;
struct node
{
int val;
node *l;
node *r;
node()
{
l = r = nullptr;
}
};
int get_height(node *root)
{
if(root == nullptr)
return 0;
return max(get_height(root -> l),get_height(root -> r)) + 1;
}
node *LL(node *root)
{
node * tmp;
tmp = root -> l;
root -> l = tmp -> r;
tmp -> r = root;
return tmp;
}
node *RR(node *root)
{
node *tmp ;
tmp = root -> r;
root -> r = tmp -> l;
tmp -> l = root;
return tmp;
}
node *LR(node *root)
{
root -> l = RR(root -> l);
return LL(root);
}
node *RL(node *root)
{
root -> r = LL(root -> r);
return RR(root);
}
node *Fix(node *root)
{
int lh = get_height(root -> l);
int rh = get_height(root -> r);
if(lh > rh)
{
if(get_height(root -> l -> l) > get_height(root -> l -> r))
root = LL(root);
else
root = LR(root);
}
else
{
if(get_height(root -> r -> l) > get_height(root -> r -> r))
root = RL(root);
else
root = RR(root);
}
return root;
}
node *Insert(node *root,int val)
{
if(root == nullptr)
{
node *tmp = new node;
tmp -> val = val;
return tmp;
}
if(val < root -> val)
{
root -> l = Insert(root -> l,val);
if(get_height(root -> l) - get_height(root -> r) == 2)
root = Fix(root);
}
else
{
root -> r = Insert(root -> r,val);
if(get_height(root -> r) - get_height(root -> l) == 2)
root = Fix(root);
}
return root;
}
int ans[25],cnt,n;
bool flag;
void bfs(node *root)
{
queue<node* >Q;
while(!Q.empty()) Q.pop();
Q.push(root);
int num = 1;
while(!Q.empty())
{
node *tmp = Q.front();
Q.pop();
ans[cnt++] = tmp -> val;
if(tmp -> l)
Q.push(tmp -> l),num++;
else
{
if(num != n) flag = false;
}
if(tmp -> r)
Q.push(tmp -> r),num++;
else
{
if(num != n) flag = false;
}
}
return ;
}
int main()
{
node *root = nullptr;
scanf("%d",&n);
for(int i = 1;i <= n;++i)
{
int a;
scanf("%d",&a);
root = Insert(root,a);
}
// printf("%d\n",root -> val);
cnt = 0,flag = true;
bfs(root);
for(int i = 0;i < cnt;++i)
printf("%d%c",ans[i],i == cnt - 1?'\n':' ');
if(!flag) puts("NO");
else puts("YES");
return 0;
}