将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。
输入格式:
输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。
输出格式:
将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES,如果该树是完全二叉树;否则输出NO。
输入样例1:
9
38 45 42 24 58 30 67 12 51
输出样例1:
38 45 24 58 42 30 12 67 51
YES
输入样例2:
8
38 24 12 45 58 67 42 51
输出样例2:
38 45 24 58 42 12 67 51
NO
答案:
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eps 1e-9
#define x first
#define y second
const int mod = 1e9 + 7;
const int MOD = 1e4+7;
const int N = 1e6 + 10;
const int M = 1111;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
int dxy[][2]={{0,1},{1,0},{1,1},{-1,1}};
using namespace std;
vector<int>vp;
int maxn=0;
struct node{
int num;
int id;
node *l,*r;
node(int x,int y){
num=x;
id=y;
l=r=nullptr;
}
};
void Insert(node *&root,int num,int id){
if(!root){
maxn=max(maxn,id);
root=new node(num,id);
}
else if(root->num>num) Insert(root->r,num,2*id+1);
else Insert(root->l,num,2*id);
}
void order(node *root){
queue<node*> que;
que.push(root);
bool flag=0;
while(que.size()){
auto top=que.front();
que.pop();
if(!flag){
cout<<top->num;
flag=1;
}
else cout<<" "<<top->num;
if(top->l) que.push(top->l);
if(top->r) que.push(top->r);
}
}
void solve(){
int n;
cin>>n;
node *root=nullptr;
int k;
for(int i=0;i<n;i++){
cin>>k;
Insert(root,k,1);
}
order(root);
cout<<endl;
if(maxn==n) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}