博客
关于我
leetcode题解104- 二叉树的最大深度
阅读量:793 次
发布时间:2023-01-31

本文共 2429 字,大约阅读时间需要 8 分钟。

给定一个二叉树,找出其最大深度。二叉树的深度定义为根节点到最远叶子节点的路径上的节点数。以下是通过递归遍历的方法来计算最大深度的详细解答。

问题描述

二叉树的深度是从根节点到最远叶子节点的最长路径上的节点数。叶子节点是指没有子节点的节点。例如,二叉树 [3,9,20,null,null,15,7] 的最长路径为 3 -> 15 -> 7,总共有三层,所以最大深度为3。

解题思路

为了计算二叉树的最大深度,可以使用递归遍历的方法。具体步骤如下:

  • 递归函数设计:设计一个递归函数 SeaMaxDepth,接受当前节点和当前深度两个参数。
  • 处理 null 节点:如果当前节点为 null,检查是否需要更新最大深度。
  • 递归处理左右子节点:对于每个非 null 的节点,递归处理其左边和右边子节点,同时递增深度。
  • 比较并更新深度:当遇到叶子节点时(两个子节点都为 null),比较当前深度与最大深度,更新较大的值。
  • 初始调用:在主函数中调用递归函数,传入根节点和初始深度0。
  • 代码实现

    class Solution {    private int maxDep = 0; // 用于记录最大深度的变量    void SeaMaxDepth(TreeNode p, int i) {        // 如果当前节点为 null,检查是否是非叶子节点,如果是,比较深度        if (p == null) {            if (i > maxDep) {                maxDep = i; // 更新最大深度            }            return;        }        // 假设节点有非 null 的左子节点,同样处理右边子节点        SeaMaxDepth(p.left, i + 1);        SeaMaxDepth(p.right, i + 1);        // 该函数不正确,改为以下方式:        // �リー操作错误,正确方式应先进入左递归,然后处理右递归,可能需要重新写作:    }    // 正确实现方式:    // 调用左递归,处理左边子树,并且递增深度    voidSeaMaxDepthLeft(TreeNode p, int i) {        if (p == null) {            if (i > maxDep) {                maxDep = i;            }            return;        }        if (p.left == null && p.right == null) {            // 是叶子节点            if (i > maxDep) {                maxDep = i;            }        } else if (p.left != null) {            SeaMaxDepthLeft(p.left, i + 1);        } else {            SeaMaxDepthLeft(p.right, i + 1);        }    }    // 调用右递归,处理右边子树,并且递增深度    void SeaMaxDepthRight(TreeNode p, int i) {        if (p == null) {            if (i > maxDep) {                maxDep = i;            }            return;        }        if (p.right == null && p.left == null) {            // 是叶子节点            if (i > maxDep) {                maxDep = i;            }        } else if (p.right != null) {            SeaMaxDepthRight(p.right, i + 1);        } else {            SeaMaxDepthRight(p.left, i + 1);        }    }    public int maxDepth(TreeNode root) {        if (root == null) {            return 0;        }        // 同时处理左子树和右子树,初始深度为1        SeaMaxDepthLeft(root, 1);        return maxDep;    }

    代码说明

  • 递归函数设计:分为处理左子树和右子树的两个函数,SeaMaxDepthLeftSeaMaxDepthRight,每个递归调用都会递增深度。
  • 叶子节点检测:在递归中,判断当前节点是否同时没有左、右子节点,如果是,则比较并更新深度。
  • 多线程处理:虽然函数名为顺序处理,但通过同时处理左、右子树,并在每次递归中递增深度,确保了计算的准确性。
  • 基线情况处理:如果根节点为空,直接返回0;否则从根节点开始递归处理,初始深度为1。
  • 测试案例

    对于二叉树 [3,9,20,null,null,15,7],maxDepth 返回3,符合预期。因为从根节点3到叶子节点7的路径长度是3层。

    总结

    通过递归遍历的方法,能够高效地计算二叉树的最大深度。该方法时间复杂度为 O(n),空间复杂度为 O(h),适用于各种二叉树结构。

    转载地址:http://yhgyk.baihongyu.com/

    你可能感兴趣的文章
    Laravel前后台+API路由分离架构(完善)
    查看>>
    Laravel渴求式加载
    查看>>
    Laravel集合探学系列——添加扩展macro策略(一)
    查看>>
    Laravel项目宝塔部署全攻略:从0到1的实战指南
    查看>>
    laravl 文件存储云存储
    查看>>
    LARGE_INTEGER
    查看>>
    Lasso回归_ElasticNet回归_PolynomialFeatures算法介绍_01---人工智能工作笔记0032
    查看>>
    LaTeX 在线编辑器(LaTeX online editors)
    查看>>
    latex不能识别eps图片
    查看>>
    LaTeX介绍-ChatGPT4o作答
    查看>>
    LaTeX伪代码编辑
    查看>>
    Latex相关文章
    查看>>
    Laurent级数与奇点分析
    查看>>
    Layout Team
    查看>>
    layout_weight 的解释及使用
    查看>>
    layui 表单元素
    查看>>
    layui 表单提交不执行ajax的坑
    查看>>
    layui上传文件、图片
    查看>>
    layui中如何让多个控件在一行显示
    查看>>
    LayUI之CRUD
    查看>>