104.二叉树的最大深度
题目链接:代码随想录-104.二叉树的最大深度
/**
* 递归法
*/
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
return Math.max(leftDepth, rightDepth) + 1;
}
111.二叉树的最小深度
题目链接:代码随想录-111.二叉树的最小深度
/**
* 递归法,相比求MaxDepth要复杂点
* 因为最小深度是从根节点到最近**叶子节点**的最短路径上的节点数量
* 代码是后续遍历 左右中
*/
public int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = minDepth(root.left);
int rightDepth = minDepth(root.right);
if (root.left == null) {
return rightDepth + 1;
}
if (root.right == null) {
return leftDepth + 1;
}
// 左右结点都不为null
return Math.min(leftDepth, rightDepth) + 1;
}
222.完全二叉树的节点个数
题目链接:代码随想录-222.完全二叉树的节点个数
递归法,这个方法可以求所有二叉树的节点,这里题目中提到了完全二叉树,所以我们可以把时间复杂度缩减一下:
public int countNodes(TreeNode root) {
int count = 0;
if (root == null) return count;
count++;
count += countNodes(root.left);
count += countNodes(root.right);
return count;
}
最优写法,这里用到的时后序遍历:
/**
* 针对完全二叉树的解法
* <p>
* 满二叉树的结点数为:2^depth - 1
*/
public int countNodes(TreeNode root) {
if (root == null) return 0;
TreeNode left = root.left;
TreeNode right = root.right;
int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便
while (left != null) { // 求左子树深度
left = left.left;
leftDepth++;
}
while (right != null) { // 求右子树深度
right = right.right;
rightDepth++;
}
if (leftDepth == rightDepth) {
return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,所以leftDepth初始为0
}
return countNodes(root.left) + countNodes(root.right) + 1;
}