题解 | #判断是不是完全二叉树#
判断是不是完全二叉树
https://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae
利用层次遍历判断是否为完全二叉树
层次遍历是从上到下,从左到右遍历,如果是完全二叉树,层次遍历的数组中出现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; } }