剑指offer-38、⼆叉树的深度

题⽬描述

输⼊⼀棵⼆叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的⼀条路径,最⻓路径的⻓度为树的深度。

示例1 输⼊:{1,2,3,4,5,#,6,#,#,7} 返回值:4

思路及解答

声明:这⾥的输⼊是⼀个数的根节点,也就是从根节点,我们就可以获取到树的所有节点,⽽类似数组的表达⽅式 {1,2,3,4,5,#,6,#,#,7} ,则是按照层次来放的。(⽐如这个树就是4层)

递归

第⼀种⽅法⽐较容易想到,对于任意⼀个节点 node ⽽⾔,我要想知道当前 node 节点(包括当前节点)的深度,肯定得求当前节点的左边节点(设为 left )的深度 leftDeepth ,以及获取右节点(设为 right )的深度 rightDeepth ,然后求两者最⼤+1( Max{leftDeepth,rightDeepth}+1 ),就是当前节点的深度。

思路:二叉树的深度 = max(左子树深度, 右子树深度) + 1

⽽递归中⽐较重要的⼀点,是结束条件。在这道题中,如果⼀个节点为 null ,就结束,并且当前节点的深度是 0 。代码超级⽆敌短:

java 复制代码
public class Solution {
     public int TreeDepth(TreeNode root) {
         if(root==null) return 0;
         return Math.max(TreeDepth(root.left),TreeDepth(root.right))+1;
     }
}

以上解法要是看不明白,可以看详细点的:

java 复制代码
public class Solution {
    public int TreeDepth(TreeNode root) {
        // 递归终止条件:空节点深度为0
        if (root == null) {
            return 0;
        }
        
        // 递归计算左子树深度
        int leftDepth = maxDepth(root.left);
        // 递归计算右子树深度
        int rightDepth = maxDepth(root.right);
        
        // 当前树深度 = 左右子树最大深度 + 1(当前节点)
        return Math.max(leftDepth, rightDepth) + 1;
    }
}
  • 时间复杂度:O(n),需要访问每个节点一次
  • 空间复杂度:O(h),递归栈深度等于树高,最坏情况(链表)为O(n)

迭代遍历

思路是如果树的根节点不为空,则将根节点放进队列中。也就是,每遍历一层,深度加1,直到遍历完所有层

设置深度 deep 为0。使⽤ while 循环,只要队列不为空,则执⾏下⾯操作:

  1. 获取队列的⼤⼩ size 。
  2. 依次取出队列的前 size 个元素,如果该元素的左边节点不为空,则将左边节点放进队列,如果该元素的右边节点不为空,则将该元素的右边节点放进队列。
  3. 层次 deep+1
java 复制代码
public class Solution {
    public int TreeDepth(TreeNode root) {
        if (root == null) return 0;
        
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int depth = 0;
        
        while (!queue.isEmpty()) {
            // 当前层的节点个数
            int levelSize = queue.size();
            
            // 遍历当前层的所有节点
            for (int i = 0; i < levelSize; i++) {
                TreeNode currentNode = queue.poll();
                
                // 将下一层节点加入队列
                if (currentNode.left != null) {
                    queue.offer(currentNode.left);
                }
                if (currentNode.right != null) {
                    queue.offer(currentNode.right);
                }
            }
            
            // 完成一层遍历,深度加1
            depth++;
        }
        
        return depth;
    }
}
  • 时间复杂度为:O(n),所有的节点需要进⼊队列,再出队列
  • 空间复杂度:O(n),借助了额外的队列空间。
相关推荐
Pniubi8 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko79 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师9 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.9 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼10 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
福兮说11 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
紧跟先前的步伐13 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
const_qiu13 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog13 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
Promising_GEO13 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析