问题描述:采用二叉链表存储表示,设计算法判断一个二叉树是否为完全二叉树。
解题思路:
1、如果树为空,则直接返回否。
2、
如果树不为空:层序遍历二叉树
。
2.1 、如果一个结点左右孩子都不为空,则 pop 该节点,将其左右孩子入队列;
2.1 、如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;
2.2 、如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树。
2.1 、如果一个结点左右孩子都不为空,则 pop 该节点,将其左右孩子入队列;
2.1 、如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;
2.2 、如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXSIZE 100
using namespace std;
typedef struct BiTNode
{
char letter;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree CreateBiTree(BiTree &T) //先序建立二叉树
{
char ch;
scanf_s("%c", &ch);
while (ch == '\r' || ch == '\n' || ch == ' ')
scanf_s("%c", &ch);
if (ch == '#')
T = NULL;
else
{
T = (BiTNode*)malloc(sizeof(BiTNode));
T->letter = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return T;
}
int JudgeTotalBiTree(BiTree T) //判断是否是完全二叉树
{
BiTree Q[MAXSIZE], p;
int f, r, i;
f = 0;
r = 0;
if (T == NULL)
return 0;
Q[r++] = T;
while (f != r)
{
p = Q[f];
f = (f + 1) % MAXSIZE;
if (p->lchild == NULL && p->rchild)
return 0;
if (p->lchild && p->rchild)
{
Q[r] = p->lchild;
r = (r + 1) % MAXSIZE;
Q[r] = p->rchild;
r = (r + 1) % MAXSIZE;
}
if ((p->lchild && p->rchild == NULL) || (p->lchild == NULL && p->rchild == NULL))
for (i = f; i != r; i = (i + 1) % MAXSIZE)
if (Q[i]->lchild || Q[i]->rchild)
return 0;
}
return 1;
}
int main()
{
BiTree T;
int k;
printf("请输入二叉树:\n");
CreateBiTree(T);
k = JudgeTotalBiTree(T);
if (k)
printf("是完全二叉树\n");
else
printf("不是完全二叉树\n");
system("pause");
}