Java中的滿二叉樹是指一棵二叉樹,其所有節點都出現在最底層和次底層,并且除了最底層,其他層的節點都有兩個子節點。
在實現滿二叉樹時,一個非常重要的因素是確定樹的深度。假設深度為d,則滿二叉樹的節點總數為2^d-1。
public class FullBinaryTree {
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public static int getDepth(TreeNode root) {
if (root == null) return 0;
int leftDepth = getDepth(root.left);
int rightDepth = getDepth(root.right);
return Math.max(leftDepth, rightDepth) + 1;
}
public static boolean isFullTree(TreeNode root) {
if (root == null) return true;
int leftDepth = getDepth(root.left);
int rightDepth = getDepth(root.right);
if (leftDepth != rightDepth) return false;
return isFullTree(root.left) && isFullTree(root.right);
}
}
另一個與二叉樹相關的概念是“最大行”。對于一棵二叉樹,從根節點開始,每一行的節點都按照從左到右的順序編號,第一行從1開始,第二行從2開始,以此類推。
找到一棵二叉樹中最大的行,可以使用層序遍歷的方法,記錄每一行遍歷到的節點數,取其中的最大值即為最大行的節點數。
import java.util.LinkedList;
import java.util.Queue;
public class MaximumRow {
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public static int maxLevel(TreeNode root) {
if (root == null) return 0;
Queuequeue = new LinkedList<>();
queue.offer(root);
int maxNum = 0, level = 0;
while (!queue.isEmpty()) {
level++;
int size = queue.size();
if (size >maxNum) maxNum = size;
while (size-- >0) {
TreeNode node = queue.poll();
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
}
return level;
}
}