二叉树: 判断二叉树是否为完全二叉树

问题描述:判断一棵二叉树是否为完全二叉树。

知识点:完全二叉树是指除二叉树的最后一层外,其他各层的节点数达到最大个数,且最后一层的叶节点从左到右连续存在,只缺右侧若干节点。

算法实现:

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。

猜你喜欢

转载自www.cnblogs.com/heibingtai/p/12690548.html