import java.util.LinkedList; import java.util.Queue; /********************************************************** * 非递归方法,基本是层次遍历二叉树 依次检查每一个节点: * 1.当发现有一个节点的左子树为空,右子树不为空时 直接返回false. * 2.当发现有一个节点的左子树不为空,右子树为空时,置标志位为1。 * 3.当发现有一个节点的左右子树均为空时,置标志位为1。 **********************************************************/ public class CompleteBinaryTree { //检查一棵树是不是完全二叉树 public boolean checking(TreeNode root) { Queue<TreeNode> queue = new LinkedList<TreeNode>(); boolean flag = false; // 叶子结点 TreeNode left; TreeNode right; queue.add(root); while (!queue.isEmpty()) { root = queue.poll(); left = root.left; right = root.right; if ((flag && (left != null || right != null)) || (left == null && right != null)) { // 如果之前层遍历的结点没有右孩子,且当前的结点有左或右孩子,直接返回false // 如果当前结点有右孩子却没有左孩子,直接返回false return false; } if (left != null) queue.offer(root.left); if (right != null)queue.offer(root.right); else flag = true; // 如果当前结点没有右孩子,那么之后层遍历到的结点必须为叶子结点 } return true; } }