力扣第104题-二叉树的最大深度

131 阅读2分钟

「这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

前言

力扣第104题 二叉树的最大深度 如下所示:

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例: 给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

一、思路

题目意思很简单,就是计算二叉树的深度

二叉树深度:是指从根节点到最远叶子节点所经过的节点数量。(也就是说根节点本身长度为 1

如下图所示的二叉树的深度为 4,具体的路径为 1 -> 2 -> 5 -> 8

image.png

这一题思路的话是比较明确的,分为以下两个步骤:

  1. 维护一个结果值 ret
  2. 遍历整个二叉树,实时更新 ret 值即可

那如何更新 ret 的值呢?

当然是使用递归来遍历的,只要当前节点不为空 null 我们就让当前的路径长度加一 +1 即可。且只有当前路径长度大于 ret 的长度时,我们才更新 ret 的值,以保证得到的是最大深度。

举个例子

此处以示例中的 [3,9,20,null,null,15,7] 作为例子,二叉树如下图所示:

image.png

ret:最终结果,初始值为 0 deep:当前路径长度

  1. 遍历到根节点 3,当前路径长度更新 deep = 1ret = max(ret, deep) = 1
  2. 继续遍历左孩子 9,当前路径长度更新 deop = 2ret = max(ret, deep) = 2
  3. 因节点 9 没有左右孩子了,所以继续遍历 3 的右孩子 20,当前路径长度更新 deop = 2,无需更新 ret
  4. 继续遍历节点 20 的左孩子 15,当前路径长度更新 deop = 3ret = max(ret, deep) = 3
  5. 因节点 15 没有左右孩子了,所以继续遍历 20 的右孩子 7,当前路径长度更新 deop = 3,无需更新 ret
  6. 至上已完成二叉树的遍历,返回结果 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);
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~