104.二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
public class Leetcode104 {
public static void main(String[] args) {
TreeNode tree = BiTree.createTreeBinary(new TreeNode(0));
System.out.println("maxDepth(tree) = " + maxDepth(tree));
}
public static int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
// 左
int left = maxDepth(root.left);
// 右
int right = maxDepth(root.right);
// 中
return Math.max(left,right)+1;
}
}
111.二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
public class Leetcode111 {
public static void main(String[] args) {
TreeNode tree = BiTree.createTreeBinary(new TreeNode(0));
System.out.println("minDepth(tree) = " + minDepth(tree));
}
public static int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
int left = minDepth(root.left);
int right = minDepth(root.right);
// 没有左子树 最小深度 为 右子树 + 1
if (root.left == null && root.right != null) {
return 1 + right;
}
// 没有右子树 最小深度 为 左子树 + 1
if (root.right == null && root.left != null) {
return 1 + left;
}
return Math.min(left, right) + 1;
}
}
222.完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点
public class LeetCode222 {
public static void main(String[] args) {
TreeNode tree = BiTree.createTreeBinary(new TreeNode(0));
System.out.println("countNodes(tree) = " + countNodes(tree));
}
public static int countNodes(TreeNode root) {
// 终止条件 1
if (root == null) {
return 0;
}
// 终止条件 2 是完全二叉树
TreeNode leftNode = root.left;
TreeNode rightNode = root.right;
int l = 0;
int r = 0;
// 只遍历左边节点
while (leftNode != null) {
leftNode = leftNode.left;
l++;
}
// 只遍历右侧节点
while (rightNode != null) {
rightNode = rightNode.right;
r++;
}
// 由于是完全二叉树 左右深度相等时 就可以利用性质求 节点数。
if (l == r) {
return (2 << l) - 1;
}
// 左
int left = countNodes(root.left);
// 右
int right = countNodes(root.right);
// 中
return left + right + 1;
}
}