JAVA二刷-Day16 | 104.二叉树的最大深度, 111.二叉树的最小深度, 222.完全二叉树的节点个数 (递归)
二叉树高度和深度的区别:https://blog.csdn.net/demonandyu/article/details/85331904
二叉树的最大深度
LeetCode题目:https://leetcode.cn/problems/maximum-depth-of-binary-tree/
解题思路
要注意递归的整体架构可以确定为前序遍历,中序遍历,后序遍历三种类型。需要确定递归所需要哪种遍历类型,以此来进行相应的递归操作。
代码:
class Solution {
public 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;
}
}
二叉树的最小深度
LeetCode题目链接:https://leetcode.cn/problems/minimum-depth-of-binary-tree/
解题思路
本题应当注意的是,比较的最小深度指的是root节点到最近的叶子节点的深度,不能直接判定如果左右子树有一个为null便直接返回数值。如果存在null应当忽略该子树的信息。
具体代码如下:
class Solution {
public int minDepth(TreeNode root) {
if (root == null) return 0;
if (root.left == null && root.right == null) return 1;
int left = Integer.MAX_VALUE;
int right = Integer.MAX_VALUE;
if (root.left != null) left = minDepth(root.left);
if (root.right != null) right = minDepth(root.right);
return Math.min(left, right) + 1;
}
}
完全二叉树的节点个数
LeetCode题目链接:https://leetcode.cn/problems/count-complete-tree-nodes/
完全二叉树定义:https://blog.csdn.net/JMW1407/article/details/108204019
解题思路
完全二叉树由于特有的性质,可以看做是很多个小的满二叉树的集合,因此可以通过满二叉树的特性来进行计算,即满二叉树的节点个数为 2 n − 1 2^n-1 2n−1,n为满二叉树的高度。因此,可以当判定节点空或者为满二叉树时,计算节点数并返回,如果没有满足,则向下递归。
因此通过满二叉树的特点进行了截断,避免了冗余的递归操作。
具体代码如下:
class Solution {
public int countNodes(TreeNode root) {
if(root == null) return 0;
TreeNode left = root.left;
TreeNode right = root.right;
int leftDepth = 0;
int rightDepth = 0;
while (left != null) {
left = left.left;
leftDepth++;
}
while (right != null) {
right = right.right;
rightDepth++;
}
if (leftDepth == rightDepth) {
return (int)Math.pow(2, leftDepth + 1) - 1;
}
return countNodes(root.left) + countNodes(root.right) + 1;
}
}