二叉树的最大深度

简介: 二叉树的最大深度

题目



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


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


使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。


对于二叉树最大深度和最大高度的理解



  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)


而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。


递归法: (三部曲)


1.递归法传参是重点


//传入的是根节点 ,得到的结果为树的最大深度
int getDepth(Node root);


2.递归的终止条件就是判断是否为叶子节点(也就是说如果下一个节点为空的话就返回 0 )


if(node == null){
    return 0;
}


3.确定单层递归的逻辑


思路

确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。


代码实现

int leftDepth = getDepth(root.left);
int rightDepth = getDepth(root.right);
return Math.max(leftDepth,rightDepth) + 1;


对于递归的题。个人感觉最好将其从题目中提取出来,因为返回值的考虑会让我们分心去思考这样递归是否会超出范围等等,所以将有返回值的递归题 提取成为一个方法是最好的做法!


class Solution {
    int result = 1;
    public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        getDepth(root,result);
        return result;
    }
    public void getDepth(TreeNode root , int deep){
        //比较,永远将最大值传给result
        result = deep > result ? deep:result;
        //递归终止条件
        if(root.left == null && root.right == null){
            return;
        }
        if(root.left != null){
            getDepth(root.left,deep+1);
        }
        if(root.right != null){
            getDepth(root.right,deep+1);
        }
    }
}


迭代法


对于这种求解深度的问题来说,使用迭代法相较来说是比较麻烦的,因为我们需要一层一层的遍历,最后得到的层数就是最大的深度。


思路

层序遍历每一次计算队列的长度时(也就是当前层的元素全部在队列中的时候)。此时将层数加1,然后将整棵树遍历完后,得到的二叉树的层数就是我们需要的最大深度


代码实现

//层序遍历的模板
class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        int dept = 0;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            dept++;
            int size = que.size();
            for(int i =0 ;i<size;i++){
                TreeNode node = que.poll();
                if(node.left != null){
                    que.offer(node.left);
                }
                if(node.right != null){
                    que.offer(node.right);
                }
            }  
        }
        return dept;
    }  
}


同类型的对于N叉树的最大深度


class Solution {
    int result = 1;
    public int maxDepth(Node root) {
        if(root == null){
            return 0;
        }
        getDepth(root,result);
        return result;
    }
    public void getDepth(Node root, int deep){
         result = Math.max(deep,result);
        //递归进行遍历
        for(int i =0 ;i< root.children.size();i++){
            getDepth(root.children.get(i),deep+1);
        }   
    }
}
//迭代法
class solution {
    /**
     * 迭代法,使用层序遍历
     */
    public int maxDepth(Node root) {
        if (root == null)   return 0;
        int depth = 0;
        Queue<Node> que = new LinkedList<>();
        que.offer(root);
        while (!que.isEmpty())
        {
            depth ++;
            int len = que.size();
            while (len > 0)
            {
                Node node = que.poll();
                for (int i = 0; i < node.children.size(); i++)
                    if (node.children.get(i) != null) 
                        que.offer(node.children.get(i));
                len--;
            }
        }
        return depth;
    }
}


二叉树的最小深度



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


最小深度是从根节点到最近叶子节点的最短路径上的节点数量。


说明: 从根节点开始 ,那么就是说如果根节点的左右子节点如果有一个为空的话那么就不能算


示例:


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


思路

和求最大深度有些类似,但是也有很多不同


思路就是 : 如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。


反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。 最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。


代码实现

class Solution {
    public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = minDepth(root.left);
        int rightDepth = minDepth(root.right);
        if (root.left == null) {
            return rightDepth + 1;
        }
        if (root.right == null) {
            return leftDepth + 1;
        }
        // 左右结点都不为null
        return Math.min(leftDepth, rightDepth) + 1;
    }
}
class Solution {
   /**
     * 迭代法,层序遍历
     */
    public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offer(root);
        int depth = 0;
        while (!deque.isEmpty()) {
            int size = deque.size();
            depth++;
            for (int i = 0; i < size; i++) {
                TreeNode poll = deque.poll();
                if (poll.left == null && poll.right == null) {
                    // 是叶子结点,直接返回depth,因为从上往下遍历,所以该值就是最小值
                    return depth;
                }
                if (poll.left != null) {
                    deque.offer(poll.left);
                }
                if (poll.right != null) {
                    deque.offer(poll.right);
                }
            }
        }
        return depth;
    }
}


求最小深度推荐用迭代法实现


image.png


目录
相关文章
|
JavaScript 前端开发 Java
MVP开发模式
MVP开发模式
590 3
|
6月前
|
存储 消息中间件 关系型数据库
(二)走进阿里云实时计算Flink版-场景案例篇
阿里云实时计算Flink版产品负责人黄鹏程(马格)介绍:基于Apache Flink打造的企业级全托管实时计算平台,支持批流一体、湖仓融合、实时风控与AI推理等场景,助力满帮、车企等客户降本增效35%,SLA达99.9%。
1480 3
(二)走进阿里云实时计算Flink版-场景案例篇
|
9月前
|
算法 量子技术 数据库
量子计算云服务初探
本文深入浅出地介绍量子计算云服务,涵盖量子比特、量子门基础,主流平台如阿里云“太章2.0”,核心算法Shor与Grover,编程框架及经典模拟技术,探讨其在化学计算与优化问题中的应用前景,并提供入门学习路径与实践案例,助力开发者迈向量子计算时代。(238字)
436 0
|
5月前
|
SQL 设计模式 数据库
还在手动拖拽画 ER 图?这款免费代码神器|DBML 语法 + 企业级实战,10 分钟搞定专业数据库设计!
dbdiagram.io 是一款免费在线ER图工具,支持用简洁DBML语法代码自动生成专业数据库关系图,可导出PNG/PDF/SVG、双向同步SQL,免安装、易分享,大幅提升企业级项目设计效率与协作质量。(239字)
|
9月前
|
运维 监控 应用服务中间件
Linux 实用命令与工具使用指南
本文系统梳理Linux运维四大核心场景——文件管理、进程监控、文本处理与系统管理中的高频实用命令及工具,涵盖find、rsync、htop、grep、awk、systemctl等,并结合实操示例与避坑技巧,助力运维人员提升效率。
395 0
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
399 6
|
机器学习/深度学习 人工智能 PyTorch
零基础入门CNN:聚AI卷积神经网络核心原理与工业级实战指南
卷积神经网络(CNN)通过局部感知和权值共享两大特性,成为计算机视觉的核心技术。本文详解CNN的卷积操作、架构设计、超参数调优及感受野计算,结合代码示例展示其在图像分类、目标检测等领域的应用价值。
764 7
|
机器学习/深度学习 IDE 数据挖掘
使用VScode的几点感受,对比Pycharm、Jupyter优劣势
使用VScode的几点感受,对比Pycharm、Jupyter优劣势
2493 5
ly~
|
存储 安全 网络安全
云数据库的安全性如何保障?
云数据库的安全性可通过多种方式保障,包括多因素身份验证、基于角色的访问控制及最小权限原则,确保仅有授权用户能访问所需数据;采用SSL/TLS加密传输和存储数据,加强密钥管理,防止数据泄露;定期备份数据并进行异地存储与恢复演练,确保数据完整性;通过审计日志、实时监控及安全分析,及时发现并应对潜在威胁;利用防火墙、入侵检测系统和VPN保护网络安全;选择信誉良好的云服务提供商,确保数据隔离及定期安全更新。
ly~
1196 2
|
机器学习/深度学习 人工智能 自然语言处理
ChatGPT最强专业学习资料集锦
本文旨在整理一份可供参考和学习的专业ChatGPT相关资料,包括ChatGPT相关论文、Github项目、以及当前市场上出现的ChatGPT相关产品等。
ChatGPT最强专业学习资料集锦