【算法】判断一颗树是否为完全二叉树

判断一颗树是否为完全二叉树

算法思想

完全二叉树规则

  1. 遍历到任何一个节点,有右孩子没有左孩子直接返回false
  2. 不违反1的情况下,当前节点左右两个孩子不全,从当前节点开始所有的节点均为叶子节点。

我们定义一个队列层序遍历二叉树,定义一个bool类型的变量,表示是否到达一个节点,这个节点的左右孩子不全,那么以后的节点就全为叶子节点。若不满足,则不是完全二叉树。

也就类似于下图:
在这里插入图片描述

代码实现

bool isCBTree(Node* head)
{
	if(head == nullptr)
		return true;
	queue<Node*> q;
	bool leaf = false;
	q.push(head);
	while(!q.empty())
	{
		Node* tmp = q.front();
		q.pop();
		Node* left = head->left;
		Node* right = head->right;
		//第一种情况是,已经开启叶节点了(leaf == true),之后的若要不是叶节点,则return false
		//第二种情况是,有右孩子,没有左孩子 return false
		if(leaf && (left != nullptr || right != nullptr) ||
		(left == nullptr && right != nullptr)) 
			return false;
		if(left != nullptr)
			q.push(left);
		if(right != nullptr)
			q.push(right);
		if(left == nullptr || right == nullptr)  //如果两个孩子中有一个为空,说明以后的全是叶节点
			leaf = true;
		   
	}
	return true;
}

猜你喜欢

转载自blog.csdn.net/weixin_43939593/article/details/105871913