思路:根据题意,完全二叉树除了最后一层叶子节点层可以缺少右侧的节点,其余层必须满节点,不能中间缺节点。 这里符合树的广度优先访问方式来处理,从根节点层往下到叶子节点层,判断非叶子节点层是否满足满节点条件,叶子节点层是否左侧没有跳缺节点。每层节点从左往右遍历,并验证下一层节点是否满足上述左侧无跳缺条件,递归调用函数。 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; } int lv = 0; List<TreeNode> treeNodesLv = new ArrayList<>(); treeNodesLv.add(root); return isCompleteTreeLv(treeNodesLv, 0); } public boolean isCompleteTreeLv(List<TreeNode> treeNodesLv, int lv) { int maxNodes = 1 << lv; if (treeNodesLv.size() == maxNodes) { // 满节点层,遍历判别,构建递归访问下层节点的参数 List<TreeNode> nextTreeNodes = new ArrayList<>(); boolean prenull = false; for (TreeNode t : treeNodesLv) { if (prenull) { if(t.right != null || t.left != null) { return false; } } else { if(t.left != null && t.right != null) { nextTreeNodes.add(t.left); nextTreeNodes.add(t.right); } else if (t.left == null && t.right == null) { prenull = true; } else if (t.left != null && t.right == null) { prenull = true; nextTreeNodes.add(t.left); } else if (t.left == null && t.right != null) { return false; } } } return isCompleteTreeLv(nextTreeNodes, lv + 1); } else { // 已达叶子节点层判别条件(只有叶子几点层允许节点不满) for (TreeNode t : treeNodesLv) { if (t.left != null || t.right != null) { return false; } } return true; } } }