/*【问题描述】编写算法判别给定二叉树是否为完全二叉树。
【输入形式】按先序序列输入二叉树的各结点的值,结点的值是单个字符,空子树输入空格。
【输出形式】是完全二叉树输出1,否则,输出0
【样例输入】例如,a,b,c三个结点的满二叉树,输入a,b, , ,c, , (b,c后边各有两个空格,对应空子树)
【样例输出】1 //表示这个满二叉树是完全二叉树*/
///这个题应该是考察二叉树的性质
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#define maxn 1000
using namespace std;
typedef struct BiTnode{
char data;
struct BiTnode *lchild,*rchild;
}BiTnode,*BiTree;
typedef struct cengci{
BiTree data[maxn];
int head;
int tail;
}cengci;
cengci L;
int n = 0;
void CreateBiTree(BiTree &T)
{
char zifu1,zifu2;
scanf("%c%c",&zifu1,&zifu2);
n++;
if(zifu1 == ' ') T = NULL;
else{
if(!(T = (BiTree)malloc(sizeof(BiTnode)))) exit(0);
T->data = zifu1;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void Enqueue(BiTree p)
{
L.data[L.tail] = p;
L.tail ++;
}
BiTree Dequeue()
{
L.head++;
return L.data[L.head-1];
}
bool IsEmpty()
{
return (L.head == L.tail);
}
void Deal(BiTree T,char bt[])
{
if(n == 1) {
printf("1\n");
return;
}
int flag = 100,i = 1;
BiTree p = T;
Enqueue(T);
while(!IsEmpty()){
p = Dequeue();
if( p == NULL)
bt[i++] = '0';
else
bt[i++] = p->data;
if(p){
Enqueue(p->lchild);
Enqueue(p->rchild);
}
}
for(int m = 1;m <= n;m++){
if(bt[m] == '0')
flag =0;
if(flag == 0&&bt[m] != '0'){
flag = 1;
break;
}
}
if(flag == 0){
printf("1\n");
}
else{
printf("0\n");
}
return;
}
int main()
{
BiTree T;
char bt[maxn] = {0};
CreateBiTree(T);
Deal(T,bt);
return 0;
}
///当时这个题得了8分,他的数据有问题
///错误的那组数据应该改为a,b,d, , ,e, , ,c,f, , , (他错误的地方在前面那个d跟e之间的空格那里,少了一个逗号)
///还有一个问题需要注意,最后不总是这样(, , ),上面这个就不是,因为还有可能就是最后一个非终端节点的度数
///不为2的情况