算法通过村第八关-树(深度优先)白银笔记

2023-11-14


前言


提示:我的整个生命,只是一场为了提升社会地位的低俗斗争。--埃莱娜·费兰特《失踪的孩子》

这一关我们看一些比较特别的题目,关于二叉树的深度和高度问题。这些对递归的考察更高些,要注意了。

给你一个二叉树:
在这里插入图片描述
我们看下力扣的相关题目,这些是关于深度和高度的问题。

推荐题目⭐⭐⭐⭐:

104. 二叉树的最大深度 - 力扣(LeetCode)

110. 平衡二叉树 - 力扣(LeetCode)

111. 二叉树的最小深度 - 力扣(LeetCode)

1. 最大深度问题

参考题目介绍:104. 二叉树的最大深度 - 力扣(LeetCode)
在这里插入图片描述
在这里插入图片描述
首先最大深度:根节点到最远叶子节点的最长路径上的节点数。说明叶子节点是没有子节点的。

我们看看下面这些。(上图的最大深度为3)

在这里插入图片描述
对于node(3),最大深度自然是左右子节点+1,左右子节点有可能为空,只要有一个,树的最大高度就是1 + 1 = 2。然后再增加几个节点:
在这里插入图片描述
很显然相对于node(20),最大的深度自然是左右子节点+1,左右子节点有可能为空,只要右一个,树的最大高度就是1 + 1 = 2,用代码表示就是:

int depth = 1 + math(leftDepth,rightDepth);

对于3,则是左右子树深度最大的那个再加1,具体谁的更大,则不必管旭,所以对于node(3)的逻辑判断就是:

int leftDepth =  getDepth(root.left); //左
int rightDepth =  getDepth(root.right); // 右
int depth = 1 + math(leftDept,rightDept); // 中

那么什么时候结束呢?这里仍然是root == null 返回0就行了,至于入参,自然是要处理的子树的根节点root,而返回值则是当前root所在子树的最大高度,所以合在一起就是:

	/**
     * 通过递归计算二叉树的深度
     *
     * @param root
     * @return
     */
    public static int maxDepth_1(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int leftDepth = maxDepth_1(root.left);
        int rightDepth = maxDepth_1(root.right);
        return Math.max(leftDepth, rightDepth) + 1;
    }

上面代码先拿到左右子树的结果,再计算Math.max(left,right) + 1,本质上和后序遍历一样,一次者可以看做事后序遍历的扩展问题。

我们继续看这个题目,如果我们确定树最大有几层是不是也确定了最大深度呢?当然,另一个思路不就来了,我们直接套用层序遍历的代码:
在这里插入图片描述
具体细节注意一下:我们这里获取层数,每获取一层,就加一。

    /**
     * 通过层次遍历来求最大深度
     *
     * @param root
     * @return
     */
    public static int maxDepth_2(TreeNode root) {
        // 校验参数
        if (root == null){
            return 0;
        }
        // 创建空间
        int res = 0;
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        // 根节点入队,不断的遍历根节点
        queue.offer(root);
        while(!queue.isEmpty()){
            // 获取到每层多少个
            int size = queue.size();
            //	size == 0 说明这一层遍历完了
            while(size > 0){
                // 遍历
                TreeNode node = queue.poll();
                if (node.left != null){
                    queue.offer(node.left);
                }
                if (node.right != null){
                    queue.offer(node.right);
                }
                size--;
            }
            res++;
        }
        return res;
    }

2. 判断平衡树

参考题目介绍:110. 平衡二叉树 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述
补充一个知识点:高度和深度怎么区分?

  • 二叉树节点的深度:从根节点到该节点的最长简单路径边的条数。
  • 二叉树节点的高度:从该节点到叶子节点的最长简单路径边的条数。

在这里插入图片描述
关于根节点的深度是1还是0的问题,不同的地方标准不一样,力扣的题目中都是以根节点的深度为1,其他的我们先不管。

我们接着看一下这个问题:

在这里插入图片描述
很显然只要有两次的时候一定是平衡的,因为对于node(3),左右孩子如果只有一个,呢么高度差就是1;如果左右孩子都没有或者都有,则高度差为0。但是如果再加一层呢?

看下图:

在这里插入图片描述
对于node(3),需要同时知道自己左右子树的最大高度差是否< 2.

  • 当节点root左/右子树的高度差 < 2,则返回节点root的左右子树中最大高度+1(max(left,right) + 1);参考上面的深度和高度对比图思考下,这里为什么取最大高度?
  • 当节点root左/右子树的高度差 >= 2;则返回-1,代表此树已经不是平衡树了。

也是就是说:

int left = recur(root.left);
int right = recur(root.right);
return Math.abs(left - right) < 2 ? Math.max(left,right) + 1:-1; 

我们此时已经写出了核心代码,假设子树已经不平衡了,我们就不需要再递归下去而是直接返回就行了。例如这个树中的节点20:
在这里插入图片描述
综合考虑几种情况,我们看下完整的代码:

	/**
     * 方法1 自下而上
     *
     * @param root
     * @return
     */
    public static boolean isBalanced_1(TreeNode root) {
        return recur(root) == -1;
    }

    public static 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;
        }
        return Math.abs(left - right) < 2 ? Math.max(left,right) + 1: -1;
    }

/**
     * 2.自上而下
     *
     * @param root
     * @return
     */
    public static boolean isBalanced_2(TreeNode root) {
        if (root == null){
            return true;
        }
        return Math.abs(depth(root.left) - depth(root.right)) <= 1 && isBalanced_2(root.left) && isBalanced_2(root.right);
    }
    public static int depth(TreeNode root){
        if (root == null){
            return 0;
        }
        return Math.max(depth(root.left),depth(root.right)) + 1;
    }

3. 最小深度

参考题目介绍:111. 二叉树的最小深度 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述
既然有最大深度,可能会有最小深度?这不他就来了,怎么找出最小深度呢?

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

看下下面这个特殊例子: 答案是 2 【说明】:叶子节点是指没有子节点的节点。
在这里插入图片描述
前面两道题涉及到最大深度,这里讲max改成min是不是就可以解决了呢? 不行,你注意看上图:

这里的关键问题是题目中说的:最小深度是从根节点到最近叶子节点的最短路径上的节点数量,也就是说最小深度的一层必须要有叶子节点,不能直接使用。

这里的核心问题仍然是终止条件分析:

  • 如果左子树为空,右子树不为空,说明最小深度是1 + 右子树的深度。
  • 反之,右子树为空,左子树不为空,最小深度1 + 左子树的深度。

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

我们看下代码展示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法通过村第八关-树(深度优先)白银笔记 的相关文章

  • 静态链表

    代码来源 晴神 算法笔记 静态链表问题通用解题模板 定义静态链表 struct Node typename data int next XXX node size 使用静态链表时 结构体类型名和结构体变量名不要相同 初始化 XXX初始化为正
  • 有一段英文由若干个单词组成,单词之间用空格分隔,编写程序提取其中所有的单词

    一 问题描述 有一段英文由若干个单词组成 单词之间用空格分隔 编写程序提取其中所有的单词 二 问题解答 解析 这里需要用到STL在算法设计中的应用 STL在算法设计中的应用有如下几种 存放主数据 存放临时数据 检测数据元素的唯一性 数据的排
  • 二叉树专题

    二叉树专题 二叉树的存储与基本操作 二叉树的遍历 先序遍历 中序遍历 后序遍历 层次遍历 利用先序遍历和中序遍历构造二叉树 二叉树的静态实现 一般的树 存储 新建结点 遍历 代码来源 晴神 算法笔记 二叉树的存储与基本操作 定义 struc
  • sprintf实例

    include
  • 数论中的欧拉函数

    在数论中 对于一正整数 n n n 欧拉函数 n varphi n n 定义为
  • algorithm头文件下的常用函数

    max min abs max x y 和min x y 的两个参数可以是浮点数 abs x 的参数必须是整数 浮点型的绝对值要使用math头文件下的fabs swap reverse reverse it1 it2 可以将数组指针在 it
  • 算法笔记-图搜索

    统计图的连通分支数 思路 建图 搜索 注意这种建图方式是有向图 反例 1 2 3 4 4 1这种不会识别出来 因此建图时需要使用有向图 在add阶段加入两个方向的路径 add时从1开始的边的标号 0用来判断结束 斗则冲突有问题 int to
  • 0027算法笔记——【回溯法】回溯法与装载问题

    1 回溯法 1 描述 回溯法是一种选优搜索法 按选优条件向前搜索 以达到目标 但当探索到某一步时 发现原先选择并不优或达不到目标 就退回一步重新选择 这种走不通就退回再走的技术为回溯法 2 原理 回溯法在问题的解空间树中 按深度优先策略 从
  • 解密 QQ 号-队列-c语言

    问题描述 分析 每次从最前面拿两个 第 1 个扔掉 第 2 个 放到尾部 需要一个数组来存储这一串数即 int q 101 并初始化这个数组即 int q 101 0 6 3 1 7 5 8 9 2 4 head 用来记录队列的队首 即第一
  • PAT题库代码(个人版本)~~持续更新,持续改进!

    引言 之前在网上看到浙江大学的题目系统PAT 想要刷一刷玩 目前是乙级题库 题目不多 持续更新 努力 话不多说 上代码 题目以及运行效果这里就不给出了 与PAT网站上的相同 1002 写出这个数 include
  • leetcode——探索字节跳动系列题目

    今天登陆leetcode发现探索区多了字节跳动的专栏 特意用了一下午去刷 有些是之前刷过的 但题目不错 就当是复习一遍吧 这里记录一下我会的以及自己觉得不错的题目 原题链接请点击题目 一 挑战字符串 3 无重复字符的最长子串 分析 这题要求
  • 求出最大连续子序列和 暴力算法、分治法、动态规划、贪心算法实现;Leecode 51.最大子序和

    求出最大连续子序列和 问题描述 给定一个整数数组 a 找到一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 这个问题也可转入Leecode 51 最大子序和 来源 力扣 LeetCode 示例 输入 2 1 3 4 1 2
  • 有一个含n(n」2)个整数的数组a,判断其中是否存在出现次数超过所有元素一半的元素

    一 问题描述 有一个含n n gt 2 个整数的数组a 判断其中是否存在出现次数超过所有元素一半的元素 二 问题分析与解答 分析 可以先将数组a中的元素递增排序 再求出出现次数最多的次数maxnum 最后判断是否满足条件 代码实现 incl
  • C语言基础知识

    文章目录 基本数据类型 浮点数比较 常用math函数 循环结构 数组 结构体 字符串 基本数据类型 整型int 一个整数占用32位 bit 即4字节 Byte 取值范围 231 231 1 即绝对值109以内整数 长整型long long
  • FFT(快速傅里叶变换)算法

    文章目录 功能 一次FFT的功能 一次IFFT的功能 总体功能 前置技能 多项式的阶 多项式的系数表达式 多项式的点值表达式 复数 复数的基本单位 复数的运算 复平面 复根 定义 几个性质 求多项式乘积的基本步骤 FFT 递归版FFT 核心
  • python-爬虫-selenium总结

    爬虫 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 爬虫 前言 使用场景 一 前期准备工作 二 基本的操作 案例 使用selenium利用验证码识别平台 超级鹰 进行各种类型验证码验证 验证根据图像识别验证码输
  • 平衡二叉树(AVL树)

    平衡二叉树树专题 存储 基本操作 插入 代码来源 晴神 算法笔记 平衡二叉树定义 左右子树高度之差的绝对值不超过1 存储 struct node int data height node lchild rchild 新建结点 node ne
  • 对比梯度下降和正规方程解性能

    现在用导数的方式模拟线性回归中的梯度下降法 首先再来回顾一下梯度下降法的基础 梯度下降法不是一个机器学习算法 而是一个搜索算法 梯度下降法用在监督学习中 梯度下降法的过程 对比模型输出值和样本值的差异不断调整本省权重 直到最后模型输出值和样
  • 设计一个算法判断表达式中的括号是否匹配

    一 问题描述 设计一个算法判断表达式中的括号是否匹配 二 问题解答 解析 这里需要用到STL在算法设计中的应用 STL在算法设计中的应用有如下几种 存放主数据 存放临时数据 检测数据元素的唯一性 数据的排序 优先队列作为堆 因此这里需要用上
  • 判断一个大于2的正整数n是否为素数的方法有多种,给出两种算法,说明其中一种算法更好的理由

    判断一个大于2的正整数n是否为素数的方法有多种 给出两种算法 说明其中一种算法更好的理由 问题解答 include

随机推荐

  • 用看黑丝的时间 我搞懂了JVM内存

    JVM内存区域主要分为线程私有区域 程序计数器 虚拟机栈 本地方法区 线程共享区域 Java堆 方法区 直接内存 1 程序计数器 线程私有区域 是一块较小的内存空间 是当前线程所执行字节码的行号指示器 每条线程都有一个独立的程序计数器 如果
  • 【总结】用树形图和剪枝操作理解完全背包问题中组合数和排列数问题

    文章目录 TOC 前言 一 完全背包中的排列数和组合数问题 1 1 问题来源 1 2 两个for循环先后顺序分析 1 2 1 先遍历背包后遍历物品得到排列数 1 2 2 先遍历物品后遍历背包得到组合数 小结 前言 建议先看理清0 1背包问题
  • Linux切换用户/超级用户权限

    在Linux操作系统 CentOS8 上安装yum工具时出现了问题 错误为 Error This command has to be run with superuser privileges under the root user on
  • npm切换源,nrm安装、配置及使用

    文章目录 人工智能福利文章 1 速度太慢 2 手动切换太麻烦 3 切换npm源推荐使用nrm 3 1 nrm安装方法 3 2 查看可选npm源 3 3 切换npm源 3 4 增加npm源 3 5 删除npm源 3 6 测试npm源速度 脑筋
  • 【UE4】【C++】PlayerController、AIController获取玩家对应的Pawn

    先创建一个基本的C 类 Tank 因为要对Tank进行各种操作 移动 寻找目标 所以选择了Pawn类型 PlayerController 再创建一个C 类 TankPlayerController 用以控制玩家操作的对象 Tank 创建好后
  • 创业公司融资,股权是如何一步步被稀释的?

    转自 https 36kr com p 5054730 融资过程中 股权的稀释总是难免的 本文作者 新元 股书 Kapbook 微信ID Kapbook 完整的股权激励在线解决方案 很多人并没有意识到 他们在加盟公司时拿到的期权比例 并非最
  • 记一次事务报错问题 Transaction synchronization is not active

    问题场景 在一次请求的返回结果中出现了这个错误信息 Transaction synchronization is not active 意思是 事务同步器没有激活 看着不像是业务代码里返回的提示 猜测是spring事务框架报出来的异常没有被
  • 基于SRS的视频直播服务器搭建

    srs提供的一个demo实例 包括实时流的rtmp播放 hls播放 视频会议 ffmpeg视频变换 jwplayer播放 OSMF播放 vlc播放等等功能 下面是在Centos 6 x环境下的编译搭建流程 1 下载或更新源码或者使用git更
  • MVC项目案例

    MVC项目 1 需求 访问链接 http localhost 8080 car get 得到JSON数据 name 保时捷 color 红色 price 641000 0 2 项目结构 cn tedu 放启动类 存子包 cn tedu se
  • [nodejs] 运行的nodejs代码走代理连接外网

    1 背景 nodejs后端调用三方服务sdk 运行主机在公司内外有网址过滤 无法连接到三方服务地址 设置代码走代理后服务调用正常 2 方法 修改node modules rest facade src Client js代码 让网络连接能够
  • Xorm 使用手册,增删改查之查

    Xorm 使用手册 增删改查之查 Xorm轻松学习 个人博客站点 简书 猫轻王 https www jianshu com u 6cce817646be 掘金 猫轻王 https juejin cn user 164091868034745
  • R 实践深度学习

    特点 将帮助您了解流行的深度学习架构及其在 R 中的变体 并为它们提供现实生活中的示例 涵盖了用于预测和分类的基本深度学习技术和概念 将了解神经网络 深度学习架构以及使用 R 实现深度学习的基础知识 将引导您使用重要的深度学习库 如 Ker
  • 4.28黄金双线收官会跌吗?今日如何稳健布局?

    近期有哪些消息面影响黄金走势 双线收官黄金多空该如何研判 黄金消息面解析 现货黄金价格周五 4月28日 小幅收跌 在美国公布第一季GDP增速低于预期后 金价在过去五个交易日内第四次收于2000美元下方 在今年初高通胀 利率继续上行和银行业危
  • 数字通信实验1 调制解调的matlab实现_实验要求

    实验1 调制解调的matlab实现 一 实验目的 掌握2ASK 2FSK 2PSK 2DPSK的调制解调实现流程 二 实验内容 完成2ASK相干解调的收发端完整程序 并画出已调制信号波形 功率谱密度波形 接收端各关键点波形 分别完成2FSK
  • 经验分享:如何运用R的MICE包对数据集中不同变量采用不同方法及跳过部分变量进行多重插补

    运用R的MICE包对数据集进行多重插补 multiple imputation 遇到两个具体需求 1 只需针对缺失值较高的部分变量而不是全部变量进行填充 但仍想将全部变量纳入数据集中 2 对于不同的具体变量 采用不同的多重插补具体方法 如处
  • 微信小程序——如何获取到输入框的值

    在微信小程序中 可以通过以下几种方式来获取输入框的值 使用 bindinput 绑定输入事件 通过 event detail value 获取输入框的值 具体操作如下
  • 拔叉零件的加工工艺,设计18铣槽的铣床夹具

    目 录 一 序言 1 二 零件的分析 3 1 零件的作用 3 2 零件的工艺分析 3 三 确定毛坯 4 四 工艺规程设计 5 五 夹具设计 14 六 总结 17 七 参考文献 18 一 序 言 机械制造工艺学课程设计使我们学完了大学的全部基
  • mock拦截axios请求,以及axios请求拦截设置token

    直接上源码
  • 投中网发布!持安科技荣登中国企业服务产业最佳投资案例TOP10

    近日 2022年度投中榜发布 持安科技凭借业内领先的零信任产品创新力 出众的方案落地实力及广阔的市场发展潜力 成功入选 投中2022年度中国企业服务产业最佳投资案例TOP10 投中榜 是投中信息秉承专业 严谨 客观 公正的原则 对中国私募股
  • 算法通过村第八关-树(深度优先)白银笔记

    文章目录 前言 1 最大深度问题 2 判断平衡树 3 最小深度 4 N叉树的最大深度 总结 前言 提示 我的整个生命 只是一场为了提升社会地位的低俗斗争 埃莱娜 费兰特 失踪的孩子 这一关我们看一些比较特别的题目 关于二叉树的深度和高度问题