当前位置: 首页 > article >正文

算法:计算二叉树的最大深度(Java实现)

思路

  1. 定义问题: 最大深度(或称为最大层数)是从根节点到最远叶子节点的路径上的节点数。我们需要找到这个最长路径的节点数。

  2. 递归的基本思路

    • 对于每个节点,我们需要计算其左子树的最大深度和右子树的最大深度。
    • 节点的最大深度是其左子树和右子树最大深度中的较大值加一(加上当前节点)。
  3. 递归终止条件

    • 如果节点为空(即树为空或到达叶子节点的子节点),深度为0。
  4. 递归步骤

    • 计算当前节点的左子树深度。
    • 计算当前节点的右子树深度。
    • 当前节点的深度是左子树和右子树深度的最大值加一。

示例代码解析

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class BinaryTree {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = maxDepth(root.left);  // 递归计算左子树的深度
        int rightDepth = maxDepth(root.right); // 递归计算右子树的深度
        return Math.max(leftDepth, rightDepth) + 1; // 当前节点的深度是左右子树深度的最大值加1
    }

    public static void main(String[] args) {
        // 示例用法
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        BinaryTree tree = new BinaryTree();
        System.out.println("Maximum Depth: " + tree.maxDepth(root)); // 输出最大深度
    }
}

步骤详解

  1. TreeNode

    • 这是一个树节点类,包含节点值val和左右子节点leftright
  2. maxDepth方法

    • 检查当前节点是否为空。如果为空,返回0(表示没有深度)。
    • 递归计算左子树和右子树的深度。
    • 使用Math.max(leftDepth, rightDepth)计算左右子树的最大深度。
    • 将最大深度加1(包括当前节点),并返回这个值。
  3. main方法

    • 构造一个示例二叉树。
    • 调用maxDepth方法并打印结果。

递归的优点

  • 简洁明了,容易理解。
  • 递归会自然处理树的结构,适用于树形结构的问题。

这个方法的时间复杂度是O(n),其中n是树中的节点数,因为每个节点都被访问一次。空间复杂度在最坏情况下是O(h),其中h是树的高度(递归栈的深度)。


http://www.kler.cn/a/311219.html

相关文章:

  • Vue功能菜单的异步加载、动态渲染
  • mapper.xml 使用大于号、小于号示例
  • SSRF〈2〉
  • NestJS 项目中如何使用 class-validator 进行数据验证
  • 数仓工具—Hive语法之窗口函数窗口范围/边界 range between和rows between
  • 代码随想录算法训练营Day13 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代、层序遍历
  • 翻页时钟 2.0-自动置顶显示,点击小时切换显示标题栏不显示标题栏-供大家学习研究参考
  • 【C++语言】模版的进一步学习
  • 网页打开时,下载的文件svg+xml类型有什么作用?
  • 99AutoML 自动化机器学习实践--NNI 自动化机器学习工具包
  • axure的下载,激活,汉化全过程,多图
  • VirtualBox增加磁盘并给docker用
  • 大数据之Spark(一)
  • 【LabVIEW】条件结构的使用
  • VMWARE安装Ubuntu24.04桌面版的问题
  • 由于 Python 环境不一致导致的No module named ‘selenium‘
  • 除了递归算法,要如何优化实现文件搜索功能
  • 改进版field-sensitive指针分析算法
  • vue2+js项目升级vue3项目流程
  • Vue 常用高级指令解析
  • @JSONField(name=xx)、@JsonProperty(value=xx)和@SerializedName的使用
  • Qt_控件的QWidget属性介绍
  • 2024年轻人驯化AI指南
  • CSS中隐藏滚动条的同时保留滚动功能
  • 桂花网蓝牙网关与智能手环联合应用于职业健康监测
  • 重修设计模式-结构型-装饰器模式