/*
题目:
有一棵二叉树,请设计一个算法判断它是否是完全二叉树。
给定二叉树的根结点root,请返回一个bool值代表它是否为完全二叉树。树的结点个数小于等于500。
*/
public boolean chk(TreeNode root) {
/*
解题思路:采用层次遍历,在遍历过程成考虑3种情况,
1节点的左右孩子不为空,则直接将该节点的左右孩子添加到队列
2节点的左孩子不为空,右孩子为空的,则将左孩子装入队列,并且循环判断队列中的所以节点,
如果队列中的节点存在左孩子或者右孩子则返回false,退出该循环
3节点的左孩子为空,右孩子不为空,则返回false
*/
if(root==null){
return true;
}
boolean flage=true;
LinkedList<TreeNode> queue=new LinkedList<TreeNode>();
queue.add(root);
while(queue.size()!=0){
TreeNode temp=queue.remove();
if(temp.left!=null&&temp.right!=null){//节点左右子树均不为空的情况
queue.add(temp.left);
queue.add(temp.right);
}
if(temp.left!=null&&temp.right==null){//节点左子树不为空,右子树为空的情况
//将该节点装入队列
queue.add(temp.left);
//判断队列中的所有节点是否有左右孩子,如果有则返回false
while(queue.size()!=0){
TreeNode s=queue.remove();
if(s.left!=null||s.right!=null){
flage=false;
break;
}
}
}
if(temp.left==null&&temp.right!=null){//如果存在左子树为空,右子树不为空的情况,则为false
flage=false;
break;
}
}//while
return flage;
}