当前位置: 首页 > 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/news/311219.html

相关文章:

  • 翻页时钟 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中隐藏滚动条的同时保留滚动功能
  • 桂花网蓝牙网关与智能手环联合应用于职业健康监测
  • 重修设计模式-结构型-装饰器模式
  • 大牛直播SDK核心音视频模块探究
  • 基于windows下docker安装HDDM并运行
  • web群集--nginx实现重定向与重写操作的详细配置过程详与案例展示
  • 【案例】--mongodb的响应慢思考案例
  • 迈入IT世界:技术趋势、职业选择与未来展望
  • 佩戴舒适且适合学生党的蓝牙耳机?分享开放式耳机排行榜前十名
  • 代码随想录算法训练营第五十九天 | Bellman_ford 算法精讲
  • 力扣100题——技巧
  • 论文速递!时序预测!DCSDNet:双卷积季节性分解网络,应用于天然气消费预测过程
  • 江科大笔记—软件安装