这是我参与更文挑战的第 22 天,活动详情查看: 更文挑战
二叉树的最大深度(104)
题目描述
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
复制代码
返回它的最大深度 3。
思路分析
寻找二叉树的最大深度,我们可以使用递归的解法,将大问题分解成子问题,也就是说分解成左子树的最大深度和右子树的最大深度,每深入一层,就进行自加 1,然后就层层分解,直到 root == null。
对于该二叉树的最大深度,我们可以使用递归的解法,将大问题分解成子问题,也就是说分解成左子树的最大深度和右子树的最大深度,每深入一层,就进行自加 1,然后就层层分解,直到 root == null。
代码展示
解法一:
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
return Math.max(maxDepth(root.left),maxDepth(root.right)) + 1;
}
复制代码
N叉树的最大深度(559)
题目描述
给定一个 N 叉树,找到其最大深度。
最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。
示例 1:
输入:root = [1,null,3,2,4,null,5,6]
输出:3
复制代码
示例 2:
输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:5
复制代码
提示
- N 叉树的高度小于或等于
1000
- 节点总数在范围
[0, 10^4]
内
思路分析
N 叉树的最大深度,解法和二叉树的最大深度很类似,我们把 N 叉树的某个节点的所有自己子节点进行遍历,同理我们可以将一个大问题分解成小问题,也就是说找出根节点的所有子节点中最大深度的那个节点,所有的问题都可以进行分解,直到该节点为空。
代码展示
解法一:
private int deep;
public int maxDepth(Node root) {
if(root == null){
return 0;
} else if(root.children.isEmpty()){
return 1;
} else {
List<Integer> heights = new LinkedList<>();
for(Node node: root.children){
heights.add(maxDepth(node));
}
return Collections.max(heights) + 1;
}
}
复制代码
总结
二叉树和N叉树的很多问题都可以使用递归进行解答,至于如何使用递归呢,关键在于如何能将大问题化解成小问题,同时大问题的解法和小问题的解法是一样的,当然递归的终止条件也是很重要的,基于以上的步骤进行分解,我们就能很快求解出类似问题的答案。
由于递归和我们人脑的思路并不是那么的类似,所以在递归问题的求解是一定要理清思路,在宏观上有个整体的把握,从大化小,化繁为简,才能做好相关题目。