分析:可以按照下面条件进行判断
1. 采用按层遍历的方式,依次遍历所有结点
2. 如果当前结点有右孩子没有左孩子,直接返回false
3. 如果当前结点有左孩子没有右孩子,那之后的结点必须为叶子结点,否则返回false
4. 如果之前步骤不返回false,则返回true;
public class CheckCompletion {
public boolean chk(TreeNode root) {
// write code here
if(root==null){
return true;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
boolean leaf=false;
TreeNode left=null;
TreeNode right=null;
while(!queue.isEmpty()){
root=queue.poll();
left=root.left;
right=root.right;
// 如果之前层遍历的结点没有右孩子,且当前的结点有左或右孩子,直接返回false
// 如果当前结点有右孩子却没有左孩子,直接返回false
if(leaf&&(left!=null||right!=null)||(left==null&&right!=null)){
return false;
}
if(left!=null){
queue.offer(left);
}
if(right!=null){
queue.offer(right);
}else{
//左右节点不全有是叶子结点
leaf=true;
}
}
return true;
}
}