将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。
输入格式:
输入第一行给出一个不超过20的正整数N
;第二行给出N
个互不相同的正整数,其间以空格分隔。
输出格式:
将输入的N
个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES
,如果该树是完全二叉树;否则输出NO
。
样例1:">样例1:">样例1:">样例1:">样例1:">样例1:">样例1:">输入样例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
对于二叉树的判定存在错误的地方只能通过左子树,在到右子树才能够成功,在以下代码中,在PTA里面能过,但是其实逻辑上存在一点问题。
就是对于这一串数字
7
9 17 4 24 16 5 27
这段代码显示错误,但是里面的树不符合要求,更加无奈的是一下代码是正确的输出YES。最后的那种方法比较好一点,能考虑到这些情况。
8
9 17 4 24 16 5 27 22
#include<iostream>
#include<queue>
using namespace std;
struct tree
{
long long val;
struct tree *l,*r;
};
bool flag1=false;
typedef struct tree tRee;
typedef tRee* Tree;
void fun(Tree& a,Tree p)
{
if(a==NULL)
{
a=p;
return ;
}
if(a->val<p->val)fun(a->l,p);
else fun(a->r,p);
}
void print(Tree head)
{
queue<Tree> bns;
queue<long long> ans;
bns.push(head);
ans.push(head->val);
bool flag=false;
while(!bns.empty())
{
Tree s=bns.front();
bns.pop();
if(s->l!=NULL)
{
bns.push(s->l);
ans.push(s->l->val);
}
else flag=true;
if(s->r!=NULL)
{
bns.push(s->r);
ans.push(s->r->val);
if(flag)flag1=true;
}
else flag=true;
}
bool io=true;
while(!ans.empty())
{
if(io){
cout<<ans.front();
io=false;
}
else cout<<" "<<ans.front();
ans.pop();
}
cout<<endl;
return ;
}
int main()
{
long long sum;
cin>>sum;
Tree head;
head=(Tree)malloc(sizeof(tRee));
head=NULL;
for(long long n=0;n<sum;n++)
{
long long number;
cin>>number;
Tree p;
p=(Tree)malloc(sizeof(tRee));
p->l=NULL;
p->r=NULL;
p->val=number;
fun(head,p);
}
print(head);
if(!flag1)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
#include<iostream>
using namespace std;
int bns[100010]={0};
void create(int n,int number)
{
if(bns[n]==0)
{
bns[n]=number;
return ;
}
if(bns[n]<number)create(n*2,number);
else create(n*2+1,number);
return ;
}
int main()
{
int sum;
cin>>sum;
for(int n=0;n<sum;n++)
{
int number;
cin>>number;
create(1,number);
}
int i,j;
for(i=2,j=2,cout<<bns[1];j<=sum;i++)
{
if(bns[i]){
cout<<" "<<bns[i];
j++;
}
}
cout<<endl;
if(i==j)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}