import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */ /** * NC198 判断是不是完全二叉树 * @author d3y1 */ public class Solution { private int seq = 0; /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 程序入口 * * @param root TreeNode类 * @return bool布尔型 */ public boolean isCompleteTree (TreeNode root) { return solution1(root); // return solution2(root); } /** * dfs * * 最后判断 节点个数与节点序号是否相等 * * @param root * @return */ private boolean solution1(TreeNode root){ // count-节点个数 seq-节点序号 int count = postOrder(root, 1); return count==seq; } /** * 递归: 后序遍历 * * 完全二叉树 * 如果当前节点索引是idx(索引从1开始), 那么他的左右子节点索引为: * left = 2*idx * right = 2*idx+1 * * @param root * @param idx * @return */ private int postOrder(TreeNode root, int idx){ if(root == null){ return 0; } seq = Math.max(seq, idx); int leftCount = postOrder(root.left, 2*idx); int rightCount = postOrder(root.right, 2*idx+1); return leftCount+rightCount+1; } /** * bfs * @param root * @return */ private boolean solution2(TreeNode root){ return levelOrder(root); } /** * 层序遍历: 队列 * 完全二叉树在遇到空节点之后剩余的应当全是空节点 * @param root * @return */ private boolean levelOrder(TreeNode root){ Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); TreeNode node; while(queue.peek() != null){ node = queue.poll(); queue.offer(node.left); queue.offer(node.right); } // 剩余的应当全是空节点 while(!queue.isEmpty() && queue.peek()==null){ queue.poll(); } return queue.isEmpty(); } }