什么是满二叉树
满二叉树(Full Binary Tree)是一种特殊的二叉树,其中每个节点都有两个子节点(左子节点和右子节点),且左子节点的左孩子和右孩子都是该节点。这种树形结构常用于实现优先队列和哈希表等数据结构。
在满二叉树中,每个节点的值域可以被表示为一个递增的满二叉树。例如,对于一个高度为 n 的满二叉树,其每个节点的值域可以表示为一个深度为 log2(n) 的满二叉树。具体来说,对于一个高度为 n 的满二叉树,我们可以将其所有节点的值域表示为一个满二叉树,其中根节点的值域为整个树的值域。这种表示方式可以简化树的遍历算法,从而提高查找、插入和删除操作的效率。
递归解法一
1.先定义一个二叉树
public class Node{
int val;
Node left;
Node right;
public Node(int val) {
this.val = val;
}
}
2.解法一思路
通过递归的过程去收集二叉树的高度和节点数信息,满二叉树的节点数等于 2 的k 次方减 1,k代表二叉树的高度,所以收集到这两条信息后,我们就可以判断是否是满二叉树了。
3.定义需要回收的信息
public class Info1{
int height;
int size;
public Info1(int height, int size) {
this.height = height;
this.size = size;
}
}
4.递归过程
public static Info1 process1(Node head){
if (head == null){
return new Info1(0,0);
}
Info1 left = process1(head.left);
Info1 right = process1(head.right);
int height = Math.max(left.height,right.height)+1;
int size = left.size + right.size + 1;
return new Info1(height,size);
}
5.主方法调用
/**
调用递归的过程
*/
public static boolean isFull1(Node head){
if (null == head){
return true;
}
Info1 info1 = process1(head);
//通过高度和节点数的关系去判断是否是满二叉树。
return ((1 << info1.height) -1) == info1.size;
}
递归解法二
1.解题思路
在递归每一个子树时,去判断是不是满二叉树和子树的高度,如果左树和右树都是满二叉树,且两者高度一样,那么整体就是满二叉树
2.定义需要的信息体
public class Info2{
boolean isFull;
int height;
public Info2(boolean isFull, int height) {
this.isFull = isFull;
this.height = height;
}
}
3.递归过程
public static Info2 process2(Node head){
if (head == null){
return new Info2(true,0);
}
Info2 left = process2(head.left);
Info2 right = process2(head.right);
int height = Math.max(left.height,right.height)+1;
boolean isFull = left.isFull && right.isFull && left.height == right.height;
return new Info2(isFull,height);
}
4.主方法调用
public static boolean isFull2(Node head){
if (head == null){
return true;
}
Info2 info2 = process2(head);
return info2.isFull;
}