判定一颗二叉树是否为完全二叉树:
int JudgeComplete(BitTree *bt) //判断二叉树是否是完全二叉树,如是,返回1,否则,返回0
【算法思想:判定是否是完全二叉树,可以使用队列,在遍历中利用完全二叉树“某节点没有左孩子,则一定无右孩子;若某节点缺左或右孩子,则其所有后继一定无孩子”的原则进行判断。(备注:判断时易犯的错误是证明其左子树和右子数都是完全二叉树,由此推出整棵二叉树必是完全二叉树的错误结论。)】
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef char ElementType;
typedef struct Node {
ElementType data; /* 数据域 */
struct Node *lchild, *rchild; /* 左、右指针域,分别存储左、右孩子的存储位置 */
} BinaryTree;
/* 先序建立二叉树 */
BinaryTree *CreBiTree( ) {
BinaryTree *bt;
ElementType x;
scanf("%c", &x);
if (x == '#') {
bt = NULL;
} else {
bt = (BinaryTree *)malloc(sizeof(BinaryTree));
bt->data = x;
bt->lchild = CreBiTree();
bt->rchild = CreBiTree();
}
return bt;
}
typedef struct {
BinaryTree* data[MaxSize];
int rear;
int front;
} CirQueue;
/*顺序循环队列初始化*/
CirQueue * CreateQueue() {
CirQueue *q;
q = (CirQueue*) malloc( sizeof(CirQueue ));
q->front = 0;
q->rear = 0;
return q;
}
/*顺序循环队列判空,返回1表示空,0表示非空*/
int QueueEmpty(CirQueue *q) {
if (q->front == q->rear)
return 1;
else
return 0;
}
/*顺序循环队列判满,返回1表示满,0表示非满*/
int QueueFull(CirQueue *q) {
if (q->front == (q->rear + 1) % MaxSize)
return 1;
else
return 0;
}
/*顺序循环队列入队*/
void EnQueue(CirQueue *q, BinaryTree* x) {
if (QueueFull(q)) {
printf("overflow!");
return;
}
q->data[q->rear] = x;
q->rear = (q->rear + 1) % MaxSize;
}
/*顺序循环队列出队*/
BinaryTree* DeQueue(CirQueue *q) {
BinaryTree* x;
if (QueueEmpty(q)) {
printf("underflow!");
return NULL;
}
x = q->data[q->front];
q->front = (q->front + 1) % MaxSize;
return x;
}
//判断二叉树是否是完全二叉树,如是,返回1,否则,返回0
int JudgeComplete(BinaryTree *bt) {
CirQueue *q = CreateQueue();
BinaryTree *p;
if (!bt) {
return 1; // 空树为满二叉树
}
EnQueue(q, bt);
while (!QueueEmpty(q)) {
p = DeQueue(q);
if (p) { // 结点非空,将其左右子树入队
EnQueue(q, p->lchild);
EnQueue(q, p->rchild);
} else { // 结点为空,检查其后是否有非空结点
while (!QueueEmpty(q)) {
p = DeQueue(q);
if (p) { // 结点非空,则二叉树为非完全二叉树
return 0;
}
}
}
}
return 1;
}
/*
A A
/ \ / \
B C B C
/ \ / / /
D E F D E
*/
void main() {
// ABD##E##CF### ABD###CE###
BinaryTree *bt;
printf("input data:");
bt = CreBiTree();
if (JudgeComplete(bt)) {
printf("是完全二叉树");
} else {
printf("不是完全二叉树");
}
}