「这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战」
前言
力扣第104题 二叉树的最大深度 如下所示:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
一、思路
题目意思很简单,就是计算二叉树的深度
二叉树深度:是指从根节点到最远叶子节点所经过的节点数量。(也就是说根节点本身长度为
1)
如下图所示的二叉树的深度为 4,具体的路径为 1 -> 2 -> 5 -> 8。
这一题思路的话是比较明确的,分为以下两个步骤:
- 维护一个结果值
ret - 遍历整个二叉树,实时更新
ret值即可
那如何更新 ret 的值呢?
当然是使用递归来遍历的,只要当前节点不为空 null 我们就让当前的路径长度加一 +1 即可。且只有当前路径长度大于 ret 的长度时,我们才更新 ret 的值,以保证得到的是最大深度。
举个例子
此处以示例中的 [3,9,20,null,null,15,7] 作为例子,二叉树如下图所示:
ret:最终结果,初始值为
0deep:当前路径长度
- 遍历到根节点
3,当前路径长度更新deep = 1,ret = max(ret, deep) = 1 - 继续遍历左孩子
9,当前路径长度更新deop = 2,ret = max(ret, deep) = 2 - 因节点
9没有左右孩子了,所以继续遍历3的右孩子20,当前路径长度更新deop = 2,无需更新ret - 继续遍历节点
20的左孩子15,当前路径长度更新deop = 3,ret = max(ret, deep) = 3 - 因节点
15没有左右孩子了,所以继续遍历20的右孩子7,当前路径长度更新deop = 3,无需更新ret - 至上已完成二叉树的遍历,返回结果
3即可
二、实现
实现代码
实现代码与思路中保持一致,使用递归看起来还是很清晰的。
int ret = 0;
public int maxDepth(TreeNode root) {
dfs(root, 0);
return ret;
}
public void dfs(TreeNode root, int deep){
ret = Math.max(ret, deep);
if (root == null){
return;
}
dfs(root.left, deep+1);
dfs(root.right, deep+1);
}
测试代码
public static void main(String[] args) {
TreeNode treeNode = new TreeNode(13,
new TreeNode(9, null, null),
new TreeNode(20, new TreeNode(15), new TreeNode(7)));
new Number104().maxDepth(treeNode);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~