class Node{
Integer data;
Node left;
Node right;
public Node(int data) {
this.data = data;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Node node = (Node) o;
return Objects.equals(data, node.data);
}
@Override
public int hashCode() {
return Objects.hash(data);
}
}
/**
* 判断一颗二叉树是否是满二叉树
* 判断:
* 1.层次遍历
* 2.二叉树的节点个数是否等于2^L-1
* @param root
* @return
*/
private static boolean isFullTree(Node root) {
//层次遍历计算个数,并且统计最大深度
Queue<Node> qu = new LinkedList<>();
qu.add(root);
// m:记录二叉树中每一层的节点个数
// height: 记录二叉树的层数,即高度
// n:表示二叉树中每一层的节点个数,它的值由m赋予,n==0表示当前层遍历完成,表示每一层的边界
// t:记录二叉树的全部节点个数
int m = 0, height = 0, n = 1, t = 1;
while(!qu.isEmpty()){
Node node = qu.poll();
n--;
if(node.left != null){
qu.add(node.left);
m++;
}
if(node.right != null){
qu.add(node.right);
m++;
}
if(n == 0){
n = m;
t += n;
m = 0;
height++;
}
}
// 判断 t == 2^L - 1
return t == ((1 << height) - 1);
}