题目:判断二叉树是否为完全二叉树。
思路:
- 设置一个辅助队列q , 一个结果参数ans,和一个辅助参数flag(用于记录是否有缺孩子结点。
- 若根节点没用左右孩子则设置ans为true。
- 结点入队,
- 判断队列是否为空 若不为空则出队。
- 判断出队结点是否有左孩子,
- 若没有左孩子则判断是否有右孩子,若有右孩子, 则设置ans = true;
- 若有左孩子,则判断之前有没有缺孩子节点,若有则记录ans = false
- 若不存在缺孩子结点,则左孩子入队,判断右孩子是否存在,若存在右孩子入队 ,不存在 设置flag = false(记录缺孩子结点);
测试用例:
// ABD##E##DF##G## 完全
// ABD###CE##F## 非完全
代码实现:
#include <iostream>
using namespace std;
#define Max 15
typedef struct treenode{
char data;
struct treenode *lchild,*rchild;
}treenode ,*tree;
void createtree(tree &t){
char ch;
ch=getchar();
if(ch=='#') t=NULL;
else{
t = (treenode *)malloc(sizeof(treenode));
t->data = ch;
t->lchild = NULL;
t->rchild = NULL;
createtree(t->lchild);
createtree(t->rchild);
}
}
struct squeue{
struct treenode *data[Max];
int f,r,tag;
};
bool isEmpty(squeue q){
if(q.f == q.r&&q.tag==0){
return true;
}
return false;
}
bool isFull(squeue q){
if (q.f==q.r&& q.tag==1)
{
return true;
}
return false;
}
bool enter(squeue &q,tree t){
if (isFull(q))
{
return false;
}
q.data[q.r] = t;
q.r = (q.r+1)%Max;
q.tag =1;
return true;
}
bool outs(squeue &q,treenode *&p){
if (isEmpty(q))
{
return false;
}
p = q.data[q.f];
q.f = (q.f+1)%Max;
q.tag = 0;
return true;
}
bool isok(tree t){
squeue q;
q.f = q.r = q.tag =0;
bool flag = true,ans = true;
if(t==NULL) return false;
if(!(t->lchild)&&!(t->rchild)) ans = true;
enter(q,t);
treenode *p;
cout<<q.f<<q.r<<q.tag;
while (!(isEmpty(q)))
{
outs(q,p);
if (!p->lchild)
{
if (p->rchild)
{
ans = false;
}
}else
{
if (flag)
{
enter(q,p->lchild);
if(p->rchild) enter(q,p->rchild);
else{
flag = false;
}
}
else
{
ans = false;
}
}
}
return ans;
}
int main(){
tree t;
createtree(t);
if (isok(t))
{
cout<<"此树为完全二叉树!";
}else{
cout<<"此树为非完全二叉树!!";
}
}