利用层次遍历判断是否为完全二叉树
层次遍历是从上到下,从左到右遍历,如果是完全二叉树,层次遍历的数组中出现null值的后面不应该再有节点值,因为完全二叉树叶子节点都在最左侧,因此可以在层次遍历中将null节点也加入队列,可以用一个布尔变量isComplete记录左边的节点是否为null,然后遇到null节点时将布尔变量设为true,表示后面不应该再有节点值了,如果符合完全二叉树,队列后面都是null值的话全都会被if判断拦截住,如果不符合,即isComplete为null,但是当前节点还有值,就返回false。
参考
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
public boolean isCompleteTree (TreeNode root) {
// write code here
if (root == null) {
return true;
}
Queue<TreeNode> queue = new LinkedList<>(); // 要用LinkedList实现队列,ArrayDeque不能存储null值
queue.offer(root);
boolean isComplete = false;
TreeNode cur;
while (!queue.isEmpty()) {
cur = queue.poll();
if (cur == null) {
isComplete = true; // 第一次遇到空节点时,说明上一层应该是叶子节点,当前层后面的节点都应该为null才是完全二叉树,所以如果后面的节点都为null,都会被这个判断拦住,如果不为null,就在后面根据isComplete是否为true判断是否为完全二叉树了
continue;
}
if (isComplete) {
return false;
}
// 空节点也会进队,然后在下一层循环中处理空节点
System.out.println(cur);
queue.offer(cur.left);
queue.offer(cur.right);
}
return isComplete;
}
}



京公网安备 11010502036488号