判断是否是完全二叉树
思路:
首先要明白,若一个结点有右孩子没有左孩子,则直接返回false。
若一个结点有左孩子没有右孩子,或者左右孩子都没有,则该结点后续所有结点都为叶结点才是完全二叉树。这里用leaf布尔值表示,若leaf=true表示后续所有结点都应该为叶结点。
public static boolean isCBT(Node head)
{
if(head == null)//空树满足完全二叉树
{
return true;
}
Queue<Node> queue = new LinkedList<Node>();//层序遍历用到的队列结构
boolean leaf = false;//
Node l = null;
Node r = null;
queue.offer(head);//根节点入队列
while(!queue.isEmpty())
{
head = queue.poll();
l = head.left;
r = head.right;
if((leaf && (l != null || r != null)) || (l == null && r!= null))
{
//前一个条件表示若leaf开启了后续所有结点都必须是叶结点,若不是返回false
//后一个条件表示若一个结点左孩子为空而右孩子不为空,直接返回false
return false;
}
if(l != null)//若左孩子不为空,左孩子入队列
queue.offer(l);
if(r != null)//若左孩子不为空,右孩子不为空,右孩子入队列
queue.offer(r);
else//若左孩子不为空,右孩子为空,开启leaf结点
{
leaf = true;
}
}
return true;
}