判断完全二叉树和满二叉树

(一)判断完全二叉树

特点一:

只允许最后一层有空缺结点且空缺在右边,即叶子结点只能在层次最大的两层上出现; 

特点二:

对任一结点,如果其右子树的深度为j,则其左子树的深度必为j或j+1 即度为1的点只有1个或0个 

解题思路:

首先一棵空树是完全二叉树
利用队列 先将根节点入队 只要当前节点不为NULL 先从队列front()得到一个节点 并将吹对节点的左右孩子入队 如果存在只有一个孩子的情况 用NULL来代替那个孩子
如果当前节点为空了 则判断队列是否weiNULL

如果队列也null了 那么此棵树就是完全二叉树

队还不为NULL那么就直接front出队 如果当前出队的节点是NULL节点 则证明不是完全二叉树

bool Is_Comp_BinaryTree(BtNode *ptr)
{
	if(ptr == NULL) return true;
	queue<BtNode*> qu;
	qu.push(ptr);

	while(ptr != NULL)//只要节点不为NULL 就进行出队 并且入出队节点的左右孩子
	{
		ptr = qu.front();qu.pop();
		if(ptr != NULL)
		{
			qu.push(ptr->leftchild);
			qu.push(ptr->rightchild);
		}
	}

	while(!qu.empty())//节点NULL 但是队列不空时 
	{
		ptr=qu.front();qu.pop();
		if(ptr == NULL)//出队节点为NULL 则证明不是一个完全二叉树  入队时 先入左 在入右
		{
			return false;
		}
	}
	return true;
}

(二)判断满二叉树

空树不是一棵满二叉树
每个节点都存在左右孩子 并且左右子树深度要相同

递归代码

//递归
bool Is_Full_BinaryTree1(BtNode* ptr)
{
	return (ptr == NULL) ||
		(ptr != NULL && Is_Full_BinaryTree1(ptr->leftchild) &&
		 Is_Full_BinaryTree1(ptr->rightchild)) &&
		 Depth_BinTree(ptr->leftchild) == Depth_BinTree(ptr->rightchild);
}

非递归思路

计算出树的深度以及树的节点个数num 

然后根据深度求出如果为满二叉树应有的节点个数sum 

如果num == sum那么为满二叉树

bool Is_Full_BinaryTree2(BtNode* ptr)
{
	if(ptr == NULL ) 
		return false;
	//求出数的深度
	int k = Depth2(ptr);
	//求出树的节点个数
	int num = Size_BinTree(ptr);
	int sum = 0;
	int count = 1;
	//遍历求出次数如果为满二叉树时的总节点数
	//满二叉树下一层节点个数为上一层的2倍
	for(int i = 0 ; i <= k ;++i)
	{
		sum += count;
		count = count*2;
	}

	if(num == sum)
		return true;
	else
		return false;
}

非递归用队列实现

将树的节点都入队

然后按照满二叉树每一层的节点个数控制节点出队  如果每一层都满足节点数控制 那么为满二叉树

只要存在一层不满足出队数量 就不是满二叉树

bool Is_Full_BinaryTree3( BtNode *ptr)
{
	if(ptr == NULL)
		return false;
	int num = 1; //控制每一层的节点个数 从根节点开始 只有一个节点

	queue<BtNode*> qu;
	qu.push(ptr);

	while(!qu.empty())
	{
		int i ;
		for( i = 0 ; i < num && !qu.empty();++i)
		{
			while(!qu.empty())
			{
				ptr = qu.front();qu.pop();
				if( ptr->leftchild != NULL)
				{
					qu.push(ptr->leftchild);
				}
				if(ptr->rightchild != NULL)
				{
					qu.push(ptr->rightchild);
				}
			}
		}
		//只要有一层出队个数小于num那么 就不是一棵满二叉树
		if(i < num )
		{
			return false;
		}
		else
		{
			num *= 2;
		}
	}
	return true ;
}

猜你喜欢

转载自blog.csdn.net/weixin_41966991/article/details/82052567