完全二叉树判断 (Judge Complete BiTree)

问题描述:采用二叉链表存储表示,设计算法判断一个二叉树是否为完全二叉树。

解题思路:

1、如果树为空,则直接返回否。

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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值