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 // 算法的时间复杂度O(N),额外空间复杂度O(N) // 1.数据准备 // 1.1 创建队列,用于层序遍历 Queue<TreeNode> queue = new LinkedList<>(); // 1.2 创建数组,用于存储结点序号及其本身(同时保留结点的父子关系),因为有序所以方便遍历 LinkedList<TreeNode> list = new LinkedList<>(); // 1.3 创建哈希表,用于根据结点查询其序号 HashMap<TreeNode, Integer> map = new HashMap<>(); // 2.层序遍历,写入数据结构 // 2.1 头结点先入队 queue.add(root); // 2.2 利用队列层序遍历 int number = 0; while (!queue.isEmpty()) { TreeNode cur = queue.poll(); // 2.3 分配编号,写入数据结构 list.add(cur); map.put(cur, number); // 2.4 子节点入队 if (cur.left != null) { queue.add(cur.left); } if (cur.right != null) { queue.add(cur.right); } // 2.5序号自增 number++; } // 3.验证完全二叉树 - i -> 2i + 1 / 2i + 2 for (TreeNode cur : list) { // 3.1 通过HashMap获得当前结点的序号 int curNo = map.get(cur); // 3.2 分别获得其左右子结点,验证序号是否满足2i + 1 / 2i + 2 if (cur.left != null) { int leftNo = map.get(cur.left); if (leftNo != (2 * curNo + 1)) { // 3.3 若当前结点不满足,则直接返回false return false; } } if (cur.right != null) { int rightNo = map.get(cur.right); if (rightNo != (2 * curNo + 2)) { // 3.3 若当前结点不满足,则直接返回false return false; } } } // 3.4 若每个结点都满足,则返回true return true; } }