问题描述:判断一棵二叉树是否为完全二叉树。
知识点:完全二叉树是指除二叉树的最后一层外,其他各层的节点数达到最大个数,且最后一层的叶节点从左到右连续存在,只缺右侧若干节点。
算法实现:
class Node {
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
}
}
//is complete binary tree
public static boolean isCBT(Node head) {
if(head == null) {
return true;
}
Queue<Node> queue = new LinkedList<>();
boolean leaf = false;
Node leftN = null;
Node rightN = null;
queue.offer(head);
while (!queue.isEmpty()) {
head = queue.poll();
leftN = head.left;
rightN = head.right;
if((leftN == null && rightN != null) || (leaf && (leftN != null || rightN != null))) {
return false;
}
if(leftN != null) {
queue.offer(leftN);
}
if(rightN != null) {
queue.offer(rightN);
} else {
leaf = true;//叶子节点开始标志,若为“完全二叉树”则之后的待处理的节点都应为叶子节点
}
}
return true;
}
算法解析:
1.按层遍历二叉树,从每层的左边向右边依次遍历;
2.如果当前节点有右孩子,但没有左孩子,直接返回false;
3.如果当前节点并不是左右孩子都有,那之后的节点应都为叶节点,否则返回false;
4.设置初始标志位true, 如果遍历结束没有返回false,则为完全二叉树,返回最终结果true。
原文:https://www.cnblogs.com/heibingtai/p/12690548.html