思路:
根据完全二叉树的定义可知,对完全二叉树按从上到下,从左到右的(即层序遍历)遍历,应该满足以下两点:
(1):
若某结点没有左孩子,则一定没有右孩子;
(2):
若某节点无左右孩子,则其后继结点一定没有孩子;
若不满足以上的任意一条,则一定不是完全二叉树。因此可采用层序遍历二叉树的方法对每个节点判断是否满足以上两点。为此,需设置两个标志变量BJ和CM,其中,BJ表示所扫描过的节点是否均有左右孩子;CM表示最后结果。
代码如下:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
class Tree {
public:
typedef struct BiNode {
char data;
struct BiNode* lchild,*rchild;
BiNode() {
lchild=rchild=NULL;
}
} BiNode,*BiTree;
BiTree root;
Tree() {
creat(root);
}
~Tree() {
Release(root);
}
void print() {
if(root) {
print(root);
cout<<endl;
}
}
int ComBiTree(BiTree root) {
int rear=-1;
int front=-1;
int BJ=1;
int CM=1;
BiTree Q[100];
if(root){
Q[++rear]=root;
while(rear!=front){
BiTree q=Q[++front];
if(q->lchild==NULL){
BJ=0;
if(q->rchild){
CM=0;
}
}
else{
CM=BJ;
Q[++rear]=q->lchild;
if(q->rchild==NULL){
BJ=0;
}
else{
Q[++rear]=q->rchild;
}
}
}
}
return CM;
}
private:
void creat(BiNode* &bt) {
char c;
cin>>c;
if(c=='#') {
bt=NULL;
} else {
bt=new BiNode;
bt->data=c;
creat(bt->lchild);
creat(bt->rchild);
}
}
void print(BiTree t) {
if(t) {
cout<<t->data;
print(t->lchild);
print(t->rchild);
}
}
void Release(BiTree bt) {
if(bt) {
Release(bt->lchild);
Release(bt->rchild);
delete bt;
bt=NULL;
}
}
};
int main() {
int n;
cin>>n;
while(n--) {
Tree t;
t.print();
cout<<t.ComBiTree(t.root)<<endl;
}
return 0;
}