【LeetCode】剑指 Offer 55. 二叉树的深度 p271 -- Java Version

news2024/11/19 0:34:48

1. 题目介绍(55. 二叉树的深度 )

面试题55:二叉树的深度, 一共分为两小题:

  • 题目一:二叉树的深度
  • 题目二:平衡二叉树

2. 题目1:二叉树的深度

题目链接:https://leetcode.cn/problems/er-cha-shu-de-shen-du-lcof/

2.1 题目介绍

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度

【测试用例】:
在这里插入图片描述

【条件约束】:

提示

  • 节点总数 <= 10000

【相关题目】:

注意:本题与主站 104. 二叉树的最大深度 题目相同。

2.2 题解 – 递归 – O(n)

时间复杂度O(n),空间复杂度O(n)

解题思路】:
常规思路:遍历得到所有路径,并从中找出最长路径(可以用栈来实现)

简化思路:找出左右子树的深度,本质上属于 后序遍历(用递归来实现)

  1. 如果一棵树 只有一个节点,那么它的深度为 1
  2. 如果根节点 只有左子树 而没有右子树,那么树的深度应该是其左子树的深度加1;
  3. 同样,如果根节点 只有右子树 而没有左子树,那么树的深度应该是其右子树的深度加1;
  4. 如果 既有右子树又有左子树,那么该树的深度就是其左、右子树深度的 较大值 再加1.

……
实现策略】:

  1. 首先还是进行无效输入判断,判断 根节点是否为空;
  2. 接着,我们通过递归来获取 左、右子树的深度
  3. 最后,选择左、右子树深度的 较大值 再加1后,返回。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    // Solution1:递归
    public int maxDepth(TreeNode root) {
        // 无效输入判断
        if (root == null) return 0;
        // 递归获取左右子树深度
        int leftD = maxDepth(root.left);
        int rightD = maxDepth(root.right);
        // 返回树深
        return (leftD > rightD) ? leftD+1 : rightD+1;
    }
}

在这里插入图片描述

3. 题目2:平衡二叉树

3.1 题目介绍

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的 深度相差不超过1 ,那么它就是一棵 平衡二叉树

【测试用例】:
在这里插入图片描述
在这里插入图片描述

【条件约束】:

限制

  • 0 <= 树的结点个数 <= 10000

【相关题目】:

注意:本题与主站 110. 平衡二叉树 题目相同。

3.2 题解 – 递归 – O(n)

时间复杂度O(n),空间复杂度O(n)
在这里插入图片描述

解题思路】:

  • 平衡树(Balance Tree,BT) 指的是,任意节点的子树的 高度差 都小于等于1,即题目中的任意节点的左右子树的 深度相差不超过1
  • 那么,我们可以想到使用 后序遍历 ,来遍历二叉树的每个节点,在遍历到一个节点之前,我们就已经遍历了它的左、右子树。只要在 遍历每个节点的时候记录它的深度 ,我们就可以一边遍历一边判断每个节点是不是平衡的。
  • 当然,我们也可以通过 先序遍历 + 判断深度 (从顶至底)的方法来判断该树是不是一棵平衡二叉树,但由于先序遍历是自顶向下的,会产生大量重复计算,时间复杂度较高,因此还是推荐使用 后序遍历(自底向下) 来解决该问题。
    ……
    实现策略】:
  1. 设置 递归终止条件,当递归到节点为空时,返回 0 ,代表 当前节点深度为 0
  2. 进行后序遍历的同时,记录下左、右子树的深度;
  3. 比较左、右子树的深度,判断当前树是不是一棵平衡二叉树,如果是则返回当前节点下的最大深度,如果不是返回 -1
  4. 最后判断递归函数返回的值是不是 -1,如果不是,则说明该树是一棵平衡二叉树。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    // Solution1:后序遍历:可以保证节点不重复利用
    public boolean isBalanced(TreeNode root) {
        return recur(root) != -1;
    }
    // 递归
    private int recur(TreeNode root) {
        // 递归终止条件
        if (root == null) return 0;
        // 后序遍历
        int left = recur(root.left);
        if(left == -1) return -1;
        int right = recur(root.right);
        if(right == -1) return -1;
        // 如果左右子树的深度差不超过1,则说明该树是平衡二叉,返回其深度,如果超过,则返回-1
        return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
    }
}

在这里插入图片描述

4. 参考资料

[1] 面试题55 - II. 平衡二叉树(从底至顶、从顶至底,清晰图解)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简单写一个Avue增删改查

今天练习了一下avue&#xff0c;真的好用&#xff0c;个人感觉相比于用element plus的组件还方便&#xff01; 简简单单的写了一个页面的增删改查&#xff0c;思路很简单。如果在写那种后台管理项目&#xff0c;基本上全是列表页&#xff0c;用这种方法写出来第一页&#xff0c…

收入下滑,亏损扩大的人力资源管理公司罗科仕申请纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;来自北京的人力资源管理公司罗科仕近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为(LGCL) 。罗科仕计划通过此次纳斯…

算法训练第五十八天 | 739. 每日温度、496.下一个更大元素 I

单调栈part01739. 每日温度题目描述思路496.下一个更大元素 I题目描述思路739. 每日温度 题目链接&#xff1a;739. 每日温度 参考&#xff1a;https://programmercarl.com/0739.%E6%AF%8F%E6%97%A5%E6%B8%A9%E5%BA%A6.html 题目描述 请根据每日 气温 列表&#xff0c;重新生…

Android组件化开发

Android组件开发 一、背景 一个app随着业务增加&#xff0c;代码放在同一个模块中会越来越臃肿&#xff0c;同时也导致多人开发的一个难度。组件化可以把业务单独分出来&#xff0c;形成一个单独模块&#xff0c;可单独运行、测试等&#xff0c;相互之间不会影响。另外一个优…

鼎捷T100制造之工艺工单实战(其他工艺补充)

文章目录 一、网状工艺二、平行工艺三、替代工艺四、返工工艺五、无顺序工艺一、网状工艺 网状工艺类似一张网状结构。可以包含平行和线性工艺等于一体。 网状工艺: 产品结构 aeci004:建立作业 aecm200: 工艺路线维护

kubeasz搭建k8s集群-部署单节点集群(AllinOne部署)

1说明 kubeasz 致力于提供快速部署高可用k8s集群的工具, 同时也努力成为k8s实践、使用的参考书&#xff1b;基于二进制方式部署和利用ansible-playbook实现自动化&#xff1b;既提供一键安装脚本, 也可以根据安装指南分步执行安装各个组件。 kubeasz 从每一个单独部件组装到完…

太赫兹高速通信系统前端关键技术

摘要&#xff1a;对构成太赫兹无线系统的2 种关键电路&#xff08;分谐波混频器和二倍频器&#xff09;进行了深入研究。在关键电路研究取得突破的基础上&#xff0c;开展了太赫兹无线通信技术研究&#xff0c;构建了220 GHz 无线通信实验验证系统。220 GHz 实验验证系统在室外…

elasticsearch 其他字段类型详解和范例

本章主要内容 elasticsearch 中别名字段的详解和范例elasticsearch 中二进制类型的详解和范例elasticsearch 中的嵌套类型的详解和范例elasticsearch 中的范围类型的详解和范例elasticsearch 中的排名类型的详解和范例elasticsearch 中的ip类型的详解和范例elasticsearch 中的…

【网络应用开发】实验3——Web组件重用与JavaBeans

目录 Web组件重用与JavaBeans预习报告 一、实验目的 二、实验原理 三、实验预习内容 1. 静态include指令何时执行&#xff1f;主页面和被包含的子页面是否转换为一个转换单元&#xff1f; 2.动作指令何时执行&#xff1f;主页面和被包含的子页面是否转换为一个转换单元&a…

【Python游戏】坦克大战、推箱子小游戏怎么玩?学会这些让你秒变高高手—那些童年的游戏还记得吗?(附Pygame合集源码)

前言 下一个青年节快到了&#xff0c;想小编我也是过不了几年节日了呢&#xff01;&#xff01; 社交媒体上流传着一张照片——按照国家规定“14岁到28岁今天都应该放半天假&#xff01;”不得不说&#xff0c; 这个跨度着实有点儿大&#xff0c;如果按整自然年来算年龄&…

Spark 连接 Hive

目录 导包 修改配置文件 修改hive-site.xml文件 启动hadoop 启动hive 启动spark 测试 查看表 导包 spark连接hive需要六个关键的jar包&#xff0c;以及将hive的配置文件hive-site.xml拷贝到spark的conf目录下。如果你hive配置没问题的话&#xff0c;这些jar都在hive的目…

Spring Security实战(四)—— 会话管理

目录 一、理解会话 二、防御会话固定攻击 三、会话过期 四、会话并发控制 五、集群会话的缺陷 六、集群会话的解决方案 七、整合Spring Session解决集群会话问题 只需在两个浏览器中用同一个账号登录就会发现&#xff0c;系统并没有任何会话并发限制。一个账号可以多处同…

cuSPARSE官方程序示例

cuSPARSE Library 简介 这个文件演示了cuSPARSE通用API的用法 官方程序&#xff1a;后续会出解析&#xff08;20230410&#xff09; cuSPARSE Generic APIs Documentation cuSPARSE Samples 向量 - 向量 操作矩阵 - 向量 操作矩阵 - 矩阵操作转换Legacy APIs优化稀疏迭代…

阿里本地生活再出发:口碑入高德,备战美团、抖音

配图来自Canva可画 近日&#xff0c;有传言称高德地图将和阿里本地生活旗下的到店业务口碑正式合并&#xff0c;未来阿里旗下所有的本地生活到店业务都将统一整合在高德地图的入口中。3月22日&#xff0c;高德地图正式确认了此事&#xff0c;并表示高德地图作为“出门好生活开…

网络软件-管理网络设备和组件

网络软件是一个术语&#xff0c;表示帮助网络管理员轻松执行特定操作的任何网络软件。术语“网络软件”可以包括广泛的软件解决方案&#xff0c;每个解决方案都提供特定的功能&#xff0c;共同帮助网络管理员完全控制其IT基础架构。网络软件工具提供监控网络运行状况、测量性能…

一个简单的MUX-VLAN实验(华为eNSP模拟器)

MUX-VLAN产生背景及用途 在数据中心网络中&#xff0c;数据中心管理员希望数据中心内部所有服务器&#xff08;或终端&#xff09;都可以访问外部网络&#xff0c;同时部分服务器之间可以互相通信&#xff0c;部分服务器之间相互隔离。一般情况下&#xff0c;为了实现所有服…

python贪吃蛇代码

文末用python写好了贪吃蛇代码可直接复制使用&#xff01; 今天和大家分享一下贪吃蛇的代码&#xff0c;主要是贪吃蛇的一些基本知识&#xff0c;以及怎么去玩。 首先&#xff0c;我们先了解一下什么是贪吃蛇&#xff1f;它是一个具有多种功能的游戏&#xff0c;可以通过点击屏…

绿联dx4600砖机救援

由于在操作ssh过程不当&#xff0c;导致成为搬砖&#xff0c;记录一下救援过程 涉及到拆机&#xff0c;会导致损保&#xff0c;建议邮寄官方救援 变砖前因&#xff1a; 发现可以使用opkg&#xff0c;遂用opkg进行安装包的操作&#xff0c;最后更新busy-box&#xff0c;而进行b…

Vue源码解析(尚硅谷)

视频地址&#xff1a;Vue源码解析系列课程 一、Vue源码解析之mustache模板引擎 1. 什么是模板引擎 模板引擎是将数据要变为视图最优雅的解决方案 历史上曾经出现的数据变为视图的方法 2. mustache基本使用 mustache库简介 mustache库基本使用 3. mustache的底层核心机理…

3.7.2数据库系统-数据库控制技术:数据库的安全性、数据库备份与恢复技术、数据备份、数据库故障与恢复、数据库性能优化

3.7.2数据库系统-数据库控制技术&#xff1a;数据库的安全性、数据库备份与恢复技术、数据备份、数据库故障与恢复、数据库性能优化数据库的安全性数据库备份与恢复技术数据备份数据库故障与恢复数据库性能优化数据库的安全性 在做信息系统开发的过程当中&#xff0c;数据库是…