这道题的后台测试数据特别水,导致很多错误的代码也可以ac,这里是博主在看了许多其他大佬的代码之后找到的较为简单的正确答案
利用结构体指针队列进行层次遍历,只要节点不为空,就将左右孩子全部进栈(NULL也进),因为是完全二叉树,所以在队列中NULL之后不应该再有非空元素
当对头往后面扫时,遇到第一个NULL后遍进行标记,之后如果遇到该标记存在且节点不为空,则必然不是完全二叉树
代码如下:
#include<iostream>
using namespace std;
typedef struct Tree
{
char x;
struct Tree *l;
struct Tree *r;
}tree;
void creat(tree *&p)
{
char s;
cin>>s;
if(s=='#')return ;
p=new tree;
p->x=s;
p->l=NULL;
p->r=NULL;
creat(p->l);
creat(p->r);
}
tree *data[100];//队列实现层次遍历
int tou=0;
int wei=0;
bool judge(tree *p)
{
data[0]=p;
wei++;
int flag_N=0;
int flag_F=0;
while(tou!=wei)
{
if(flag_N==1&&data[tou]!=NULL) //NULL后面有非空元素
flag_F=1;
if(data[tou]==NULL&&flag_N==0) //标记第一个NULL的出现
flag_N=1; //注意判非空和标记第一个NULL的先后顺序
if(data[tou]!=NULL) //这里一定要判空
{
data[wei]=data[tou]->l ;
wei++;
data[wei]=data[tou]->r ;
wei++;
}
tou++;
}
if(flag_F==1)return false;
else return true;
}
int main()
{
tree *p;
creat(p);
if(judge(p)==true)cout<<"Y";
else cout<<"N";
return 0;
}