【题目】判断二叉树是否是完全二叉树
【思路】
1.如果当前节点有右子节点,但没有左子节点,则不是完全二叉树
2.在满足条件一,如果有右子节点,则必然存在左子节点。那么判断当前节点是否有右子节点,如果没有,那么在后面继续遍历的节点中,必定都不存在子节点,也就是说,后面遍历的节点,都是叶子节点,没有孩子节点
private boolean isCBT(Node head){
if (null == head){
return true;
}
LinkedList<Node> queue = new LinkedList<>();
queue.add(head);
//false表示是双全的节点
boolean leaf = false;
while (!queue.isEmpty()){
Node node = queue.poll();
//在遇到不双全的节点以后,当前节点有叶节点,也就是说当前节点不是叶节点,返回false
if ((leaf && (node.left != null || node.right != null)
|| (node.left == null && node.right != null))){
return false;
}
if (null != node.left){
queue.add(node.left);
}
if (null != node.right){
queue.add(node.right);
} else {
leaf = true;
}
// if (null == node.left || null == node.right){
// leaf = true;
// }
}
return true;
}
完整的测试代码
public class IsCBT {
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
}
}
private static boolean isCBT(Node head){
if (null == head){
return true;
}
LinkedList<Node> queue = new LinkedList<>();
queue.add(head);
boolean leaf = false;
while (!queue.isEmpty()){
Node node = queue.poll();
//在遇到不双全的节点以后,当前节点有叶节点,也就是说当前节点不是叶节点,返回false
if ((leaf && (node.left != null || node.right != null)
|| (node.left == null && node.right != null))){
return false;
}
if (null != node.left){
queue.add(node.left);
}
if (null != node.right){
queue.add(node.right);
} else {
leaf = true;
}
// if (null == node.left || null == node.right){
// leaf = true;
// }
}
return true;
}
public static void main(String[] args) {
Node node = new Node(1);
node.left = new Node(2);
node.right = new Node(3);
node.left.left = new Node(4);
node.left.right = new Node(5);
node.right.left = new Node(6);
node.right.right = new Node(7);
node.left.left.left = new Node(8);
node.left.left.right = new Node(9);
node.left.right.left = new Node(10);
node.left.right.right = new Node(11);
// node.right.left.right = new Node(12);
boolean res = isCBT(node);
System.out.println(res);
}
}