判断二叉树是否为完全二叉树
完全二叉树看起来就像是满二叉树右下角缺了一口。
思路:
需要引入一个标志位来区分两个阶段
1.先对该树进行层序遍历,会出现两种阶段
a):任何一个节点都有两颗子树
当遇到一个结点没有子树或者只有左子树时,那么就进入第二阶段。当遇到一个节点只有右子树时,那么这棵树一定不是完全二叉树。
b):
任何一个节点,都没有子树
2.当我们层序遍历结束后,整棵树满足上述条件,那么这棵树就是完全二叉树
(找不到反例,则证明正确)
//判断一颗树是否为完全二叉树
boolean isCompleteTree(TreeNode root){
Queue<TreeNode> queue=new LinkedList<>();
boolean secondStage=false;//第二阶段标志位,因为刚开始都是处于第一阶段,所以默认为false
queue.offer(root);
if (root == null) {
return true;//空树一定是完全二叉树
}
while (!queue.isEmpty()){
//针对当前节点进行访问,这个访问指进行判断
TreeNode cur=queue.poll();
if (secondStage==false) {
//左右子树都不为空,第一阶段,入队列
if (cur.left != null && cur.right != null) {
queue.offer(cur.left);
queue.offer(cur.right);
}
//左子树不为空,右子树为空,切换到第二阶段,入队列
if (cur.left != null && cur.right == null) {
queue.offer(cur.left);
secondStage = true;//切换阶段
}
//左子树为空,右子树不为空,一定不是完全二叉树不符合规则
if (cur.left == null && cur.right != null) {
return false;
}
//左右子树都为空,切换至第二阶段
if (cur.right == null && cur.left == null) {
secondStage = true;
}
}
//第二阶段,所以节点都不能有左右子树
else {
if (cur.left!=null||cur.right!=null) {
return false;
}
}
}
//当所有条件都判断完,也没有找到反例,则说明该树是一颗完全二叉树
return true;
}