判断一棵树是否为完全二叉树
首先我们来看什么是完全二叉树,通俗来说完全二叉树就是所有叶子节点这一层级全是满的,或者不满的话也需要叶子节点从左到右呈现满的状态。其实语言确实不好理解,咱们看图说话,相信看了下边这张图,大家就了解什么是完全二叉树了。
1.如何判断一棵二叉树是不是完全二叉树
首先我们需要按宽度遍历二叉树,就如下图所示:
(1)任何一个节点,如果有右子树而没有左子树,那么就不是完全二叉树,返回false
(2)在条件(1)不违规的情况下,如果遇到了第一个叶子不全的节点,那么他后续的节点必须全是叶子节点,才是完全二叉树
2.代码
接下来我们直接看代码
//首先是定义的二叉树
public class Node {
public int data;
public Node leftNode;
public Node rightNode;
public Node(int data) {
this.data=data;
}
public Node(int data, Node leftNode, Node rightNode) {
this.data = data;
this.leftNode = leftNode;
this.rightNode = rightNode;
}
}
//判断是否是完全二叉树算法
public boolean isCBT() {
return isCBT(root);
}
//判断一棵树是否是完全二叉树
public static boolean isCBT(Node head) {
if(head==null) {
return true;
}
//创建一个队列
LinkedList<Node> queue=new LinkedList<>();
//是否遇到过左右两个孩子不全的节点 false:没有遇到,true:遇到
boolean leaf=false;
Node left=null;
Node right=null;
//将头节点加入队列
queue.add(head);
while(!queue.isEmpty()) {
//将头节点弹出队列
head=queue.poll();
left=head.leftNode;
right=head.rightNode;
/**
如果遇到左孩子为空而右孩子不为空,则不是完全二叉树;
或者已经遇到了左孩子不空右孩子为空的节点,而他的下一个节点却不是叶子节点,则也不是完全二叉树
*/
if((leaf&&(left!=null||right!=null))||(left==null&&right!=null)) {
return false;
}
//左孩子不为空,队列里加入左孩子
if(left!=null) {
queue.add(left);
}
//右孩子不为空,队列里加入右孩子
if(right!=null) {
queue.add(right);
}
//一棵树如果左孩子为空或者右孩子为空,leaf=true,证明要开始判断上边所写的条件(2)了
if(left==null||right==null) {
leaf=true;
}
}
return true;
}
//测试类
public class Test {
public static void main(String[] args) {
Tree tree=new Tree();
Node node=new Node(6,new Node(4,new Node(3),new Node(5)),new Node(8,new Node(7),new Node(9)));
boolean b=tree.isCBT(node);
System.out.println("这棵树是不是完全二叉树:"+ b);
}
}