如何判段是否一个完全二叉树
宽度优先遍历
条件:
1、不能有右无左,
2、遇到孩子不双全的节点,接下来遇到的节点必是叶子节点
public static boolean isCBT(TreeNode head){
if(head==null){
return true;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.add(head);
//是否遇到孩子不双全的节点
boolean isMeet=false;
while (!queue.isEmpty()){
TreeNode cur=queue.poll();
TreeNode l=cur.left;
TreeNode r=cur.right;
//遇到孩子不双全的节点,接下来遇到的节点必是叶子节点
if(isMeet&&!(l==null && r==null)){
return false;
}
//不能有右无左
if(r!=null&&l==null){
return false;
}
if(l!=null){
queue.add(l);
}
if(r!=null){
queue.add(r);
}
if(l==null||r==null){
//遇到了孩子不双全的节点
isMeet=true;
}
}
return true;
}