package com.camnter.basicexercises.tree;
import com.camnter.basicexercises.core.TreeNode;
import java.util.LinkedList;
import java.util.Queue;
/**
* 判断 完全二叉树
*
* 四个要点
*
* 按层遍历二叉树,从每层的左边向右边依次遍历所有的节点
* 如果当前节点有有右节点,但是没有左节点,返回 false
* 如果当前节点并不是左右节点全有,那之后的节点必须是叶子节点,否则返回 false
* 遍历过程中如果不返回 false,遍历结束后要返回 true
*
* @author CaMnter
*/
public class IsCompleteBinaryTree {
public boolean isCompleteBinaryTree(TreeNode root) {
if (root == null) return false;
Queue> queue = new LinkedList>();
queue.add(root);
TreeNode l;
TreeNode r;
boolean leaf = false;
while (!queue.isEmpty()) {
root = queue.poll();
l = root.left;
r = root.right;
/**
* 如果当前节点并不是左右节点全有,那之后的节点必须是叶子节点,否则返回 false
* 如果当前节点有有右节点,但是没有左节点,返回 false
*/
if ((leaf && (l != null || r != null)) || (l == null && r != null)) {
return false;
}
if (l != null) queue.add(l);
if (r != null) {
queue.add(r);
} else {
/**
* 经过上面判断,如果接下来 右节点没的话
* 并且如果是完全二叉树的话,不管是同一层还是下一层的节点
* 都是叶子节点了
*/
leaf = true;
}
}
return true;
}
public static void main(String[] args) {
IsCompleteBinaryTree isCompleteBinaryTree = new IsCompleteBinaryTree();
System.out.println(isCompleteBinaryTree.isCompleteBinaryTree(TreeNode.getCBT()));
System.out.println(isCompleteBinaryTree.isCompleteBinaryTree(TreeNode.getBST()));
}
}