完全二叉树的特点:
1.只允许最后一层的左边有空缺或自身为叶子节点,即叶子结点只能在最后两层上出现;
2.对任一结点,如果其右子树的深度为j,则其左子树的深度必为j或j+1。 即度为1的点只有1个或0个
3.若出现某节点只有左节点或自身为叶子节点,则此后的节点都为叶子节点
思路:
1.如果root为null则直接返回false
2.如果树不为空,则定义队列并将root放入,开始层序遍历二叉树
3.
- 如果node.left != null && node.right != null 则将node.left和node.right按顺序存入队列
- 如果node.left == null && node.right != null 则返回false
- 如果node.left != null && node.right == null 或 node.left == null && node.right == null则后面遍历的节点都为叶子节点才为完全二叉树
- 遍历完成返回true
java代码:
/**
* 判断是否为完全二叉树
* @return
*/
public boolean isComplete() {
if (root == null) return false;
Queue<Node<E>> queue = new LinkedList<>();
queue.offer(root);
boolean leaf = false;
while (queue != null) {
Node<E> node = queue.poll();
if (leaf && !isLeaf(node)) return false;
if (node.left != null) {
queue.offer(node.left);
}else if (node.right != null) { // node.left == null && node.right != null
return false;
}
if (node.right != null) {
queue.offer(node.right);
}else { // node.right == null后面的节点都应为叶子节点
leaf = true;
}
}
return true;
}
public boolean isLeaf(Node<E> node) {
return node.left == null && node.right == null;
}