判断是否是完全二叉树|c语言

120 阅读1分钟

注意:这里采用的创建二叉树的方法,是输入先序序列,递归创建二叉树,要求输入的数字顺序是合理的先序,不然就没办法创建成功

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAXQSIZE 100

typedef struct BiTNode {
    int data;
    struct BiTNode *lchild, *rchild;//左右子树根结点地址 
}BiTNode, *BiTree;

typedef struct {
	BiTree *base;
	int front, rear;
}SqQueue;//定义循环队列
 
void CreateBiTree(BiTree &T)
{	int ch;
	scanf("%d",&ch);
	if (ch == -1) T = NULL;
	else
	{	T = (BiTNode *)malloc(sizeof(BiTNode));
		T->data = ch;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
}

void InitQueue(SqQueue &Q)
{	Q.base = (BiTree *)malloc(MAXQSIZE * sizeof(BiTree));
	Q.front = Q.rear = 0;
}

void EnQueue(SqQueue &Q, BiTree e)
{	if((Q.rear + 1) % MAXQSIZE == Q.front) return;	//队满
	Q.base[Q.rear] = e;
	Q.rear = (Q.rear + 1) % MAXQSIZE;;
}

void DeQueue(SqQueue &Q, BiTree &e)
{	if(Q.rear == Q.front) return;	//队空
	e = Q.base[Q.front];
	Q.front = (Q.front + 1) % MAXQSIZE;
}

int QueueEmpty(SqQueue Q)
{	if(Q.rear == Q.front) return 1;
	else	return 0;
}

//将所有结点(包括空节点)全部入队,遇到第一个孩子为空的节点则检查其后面是否还有非空的节点,有的话不是完全二叉树,没有则是完全二叉树
int IsComplete(BiTree T){
    SqQueue Q;
    InitQueue(Q);
    BiTree p = (BiTNode*)malloc(sizeof(BiTNode));
    p = T;
    if(!p){
        return 1;        //空树是完全二叉树
    }
    EnQueue(Q, p);      //入队
    while(!QueueEmpty(Q)){
        DeQueue(Q,p);
 
        if(p){  //全部入队 遇到第一个空节点转到else
            EnQueue(Q,p->lchild);
            EnQueue(Q,p->rchild);
        }else{      //遇到空节点时开始检查队列中是否满足完全二叉树
            while(!QueueEmpty(Q)){
                DeQueue(Q, p);
                if(p){
                    return 0;
                }
            }
        }
    }
    return 1;        //是完全二叉树
}

int main() {
	BiTree T = (BiTNode*)malloc(sizeof(BiTNode));
	CreateBiTree(T);
	printf("\n是否是完全二叉树(1代表是,0代表否):");
	int result = IsComplete(T);
	printf("%d", result);
}