[树] 6.49 判断完全二叉树、满二叉树 - C语言

题目来源:严蔚敏《数据结构》C语言版本习题册 6.49

// 6.49 编写算法判别给定二叉树是否为完全二叉树
Status BiTreeIsComplete(BiTree T) {
	// 思路:完全二叉树的层次遍历应该是没有NULL的
	// 实现:把所有的结点都入队列,包括空指针
	BiTNode *queue[maxSize], *p;
	int front,rear;
	int flag=0;
	front=rear=0;
	queue[rear]=T;rear=(rear+1)%maxSize; //入队列
	while (front!=rear) { //队列不为空
		p=queue[front];front=(front+1)%maxSize; //出队列
		if (!p) flag=1; //出现了空指针
		else if (flag) return ERROR; //出现了一个非空结点,但前面已经扫描到了空指针,不是完全二叉树
		else { //不管是不是空,都入队列
			queue[rear]=p->lchild;rear=(rear+1)%maxSize;
			queue[rear]=p->rchild;rear=(rear+1)%maxSize;
		}
	}
	return TRUE;
}
// 是否为满二叉树
Status IsTwoN(int num) {
	if ( (num&(num-1)) ) //去掉一个1,判断是否为0
		return ERROR;
	return TRUE;
}
Status BiTreeIsFull(BiTree T) {
	// 先判断是否为完全二叉树
	// 在上一步的时候得到结点的个数sum,sum=2^n-1 --> 根据这个公式:判断sum+1是不是2的次方即可
	int sum=0;
	BiTNode *queue[maxSize], *p;
	int front,rear;
	int flag=0;
	// 判断是否为完全二叉树
	front=rear=0;
	queue[rear]=T;rear=(rear+1)%maxSize;
	while (front!=rear) {
		p=queue[front];front=(front+1)%maxSize;
		if (!p) flag=1; //层次遍历出现了空
		else if (flag) return ERROR; //出现了一个非空结点,但前面已经扫描到了空指针,不是完全二叉树
		else { //空指针也入队
			sum++; //计算结点的个数
			queue[rear]=p->lchild;rear=(rear+1)%maxSize;
			queue[rear]=p->rchild;rear=(rear+1)%maxSize;
		}
	}
	// 为完全二叉树
	printf("结点总数为:%d\n", sum);
	return IsTwoN(sum+1);
}

    原文作者:满二叉树
    原文地址: https://blog.csdn.net/summer_dew/article/details/84496693
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞