题目:
给定一棵二叉树的头节点head,返回这颗二叉树是不是满二叉树
满二叉树定义:
1、解决方案1
1.1、思路:
1、获取该树的高度(height)
2、获取该树的节点树(nodes)
3、如果height的N次方减去1正好等于nodes,那么该树就是满二叉树
1.2、代码:
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
//方案一:
public static boolean isFull1(Node head) {
if (head == null) {
return true;
}
//该的数高度
int height = h(head);
//该树的节点数
int nodes = n(head);
return (1 << height) - 1 == nodes;
}
//得到该树的高度
public static int h(Node head) {
if (head == null) {
return 0;
}
return Math.max(h(head.left), h(head.right)) + 1;
}
//得到该树的节点数
public static int n(Node head) {
if (head == null) {
return 0;
}
return n(head.left) + n(head.right) + 1;
}
2、解决方案2:
2.1、思路:
向左右子树分别要信息
返回左子树高度以及节点数,右子树高度以及节点数
最后根据信息来判断
2.2、代码:
//方案二:
public static boolean isFull2(Node head) {
if (head == null) {
return true;
}
Info all = process(head);
return (1 << all.height) - 1 == all.nodes;
}
public static class Info {
//以该节点为头的子树的高度
public int height;
//以该节点为头的子树的节点数
public int nodes;
public Info(int h, int n) {
height = h;
nodes = n;
}
}
public static Info process(Node head) {
if (head == null) {
return new Info(0, 0);
}
//向左树要一部分信息
Info leftInfo = process(head.left);
//向右树要一部分信息
Info rightInfo = process(head.right);
//该节点的高度为左右子树高度取最大值加上1
int height = Math.max(leftInfo.height, rightInfo.height) + 1;
//该以该节点为头的节点树为:左右子树节点数相加,再加上1
int nodes = leftInfo.nodes + rightInfo.nodes + 1;
return new Info(height, nodes);
}