day15 二叉树 | 104、二叉树的最大深度 111、二叉树的最小深度 222、完全二叉树的节点个数

news2024/12/26 20:41:50

题目

104、二叉树的最大深度

在这里插入图片描述
递归法(后序)(必须会)

// 定义:输入根节点,返回这棵二叉树的最大深度
int maxDepth(TreeNode root) {
    if (root == null) {
        return 0;
    }
    // 利用定义,计算左右子树的最大深度
    int leftMax = maxDepth(root.left);
    int rightMax = maxDepth(root.right);
    // 整棵树的最大深度等于左右子树的最大深度取最大值,
    // 然后再加上根节点自己
    int res = Math.max(leftMax, rightMax) + 1;

    return res;
}

迭代法(层序)(必须会)

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null)   return 0;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        int depth = 0;
        while (!que.isEmpty())
        {
            int len = que.size();
            while (len > 0)
            {
                TreeNode node = que.poll();
                if (node.left != null)  que.offer(node.left);
                if (node.right != null) que.offer(node.right);
                len--;
            }
            depth++;
        }
        return depth;
    }
}

111、二叉树的最小深度

在这里插入图片描述
迭代法(层序)

class Solution {
    public int minDepth(TreeNode root) {
        if(root==null)
            return 0;
        
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        int depth = 0;
        while(!q.isEmpty()){
            int sz = q.size();
            depth+=1;
            for(int i=0;i<sz;i++){
                TreeNode cur = q.poll();
                if(cur.left==null && cur.right==null)
                    return depth;
                if(cur.left!=null)
                    q.offer(cur.left);
                if(cur.right!=null)
                    q.offer(cur.right);
            }
        }
        return depth;
    }
}

递归法(复杂一些)

如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。
反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。 最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。
遍历的顺序为后序(左右中),可以看出:求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。

class Solution {
    /**
     * 递归法,相比求MaxDepth要复杂点
     * 因为最小深度是从根节点到最近**叶子节点**的最短路径上的节点数量
     */
    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;
    }
}

222、完全二叉树的节点个数

在这里插入图片描述
递归法

class Solution {
    public int countNodes(TreeNode root) {
        if(root==null) return 0;
        int leftNum = countNodes(root.left);
        int rightNum = countNodes(root.right);
        return leftNum+rightNum+1;
    }
}

迭代法(层序)

class Solution {
    // 迭代法
    public int countNodes(TreeNode root) {
        if (root == null) return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int result = 0;
        while (!queue.isEmpty()) {
            int size = queue.size();
            for(int i=0;i<size;i++){
                TreeNode cur = queue.poll();
                result++;
                if (cur.left != null) queue.offer(cur.left);
                if (cur.right != null) queue.offer(cur.right);
            }
        }
        return result;
    }
}

平衡二叉树

递归法
此时大家应该明白了既然要求比较高度,必然是要后序遍历。

递归三步曲分析:

  • 1、明确递归函数的参数和返回值
    参数:当前传入节点。
    返回值:以当前传入节点为根节点的树的高度。
    那么如何标记左右子树是否差值大于1呢?
    如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。所以如果已经不是二叉平衡树了,可以返回-1 来标记已经不符合平衡树的规则了。
    代码如下:
    // -1 表示已经不是平衡二叉树了,否则返回值是以该节点为根节点树的高度
    int getHeight(TreeNode* node)
  • 2、明确终止条件
    递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0
    代码如下:
    if(root==null) return 0;
  • 3、明确单层递归的逻辑
    如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?当然是其左子树高度和其右子树高度的差值。
    分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

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

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

相关文章

论文笔记:Graph WaveNet for Deep Spatial-Temporal Graph Modeling

IJCAI 2019 1 abstract & intro 时空数据挖掘问题大多数使用邻接矩阵来建模节点之间的属性关系&#xff0c;这种思路的一个基本假设是&#xff1a;节点信息取决于自身和邻居的历史信息。 但这类模型的假设存在着一些问题&#xff1a; 未能充分建模节点之间的依赖关…

宝塔部署springboot,vue,node.js项目

宝塔部署springboot项目&#xff1a; 先将命令转移到jar包所属文件夹中 分为短暂部署和永久部署 短暂部署&#xff1a;java -jar xxx.jar 永久部署&#xff1a;nohup java -jar demo-1.0.0.jar logs_mark.txt 2>&1 & nohup:linux的命令,代表关闭但持续运行 查看898…

52.Isaac教程--操纵杆

操纵杆 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录操纵杆使用游戏机操纵杆使用其他操纵杆使用 Playstation 操纵杆很容易控制运行 Isaac SDK 的机器人&#xff0c;但也可以使用其他控制器。 使用游戏机操纵杆 按照以下步骤校准您的…

微信小程序018小说在线阅读系统书城

管理员的主要功能有&#xff1a; 1.管理员输入账户登陆后台 2.个人中心&#xff1a;管理员修改密码和账户信息 3.用户管理&#xff1a;对注册的用户信息进行删除&#xff0c;查询&#xff0c;添加&#xff0c;修改 4.小说信息管理&#xff1a;对小说信息进行添加&#xff0c;修…

TCP/IP第六章笔记ICMP协议

文章目录6.1 引言6.2 ICMP报文分组格式和类型6.3 ICMP地址掩码请求与应答6.4 ICMP时间戳请求与应答6.5 ICMP端口不可达差错6.6 ICMP的处理&#xff08;4.4BSD系统下&#xff09;6.1 引言 第三章在IP选择路由时&#xff0c;如果一个报文最后限制转发次数用完后还传输不到目的地…

【高并发】- 不可不知道的RPC框架服务通信

前言 前面章节讲解了高并发系统中相关指标、为什么要学习高并发设计思想、高并发系统中每个环节的流量处理等思想。本章节讲解服务通信&#xff0c;来帮助大家更好理解系统间通信过程。 1 RPC框架介绍 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff0…

Win10家庭版和Win10专业版有什么区别?

win10操作系统拥有7个不同的版本&#xff0c;其中win10家庭版和专业版被人们广泛的应用&#xff0c;很多用户都不知道如何区分win10家庭版和专业版&#xff0c;接下来把win10家庭版和专业版有什么不同的地方告诉大家。我们一起来看看吧。 win10家庭版和专业版的区别&#xff1a…

java服务框架高级之微服务保护 Sentinel 限制规则,流控模式,流控效果

初识Sentinel 雪崩问题&#xff1a; 解决雪崩问题的常见方式有四种&#xff1a; 1.超时处理&#xff1a;设定超时时间&#xff0c;请求超过一定时间没有响应就返回错误信息&#xff0c;不会无休止等待 2.舱壁模式&#xff1a;限定每个业务能使用的线程数&#xff0c;避免耗尽…

2023外企还香吗?2022届计算机谈谈入职外企的感受和经历

互联网寒冬&#xff0c;大规模“毕业”的环境下&#xff0c;2023年外企又香了吗&#xff1f; 大家好&#xff0c;我是2022届计算机应届毕业生&#xff0c;毕业入职了一家大型非互联网外企&#xff0c;2022年由于只上了半年班&#xff0c;所以只有半年工资&#xff0c;总收入在1…

【JavaScript速成之路】一文带你初识JavaScript

&#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f525;系列专栏&#xff1a;【JavaScript速成之路】 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 文章目录前言1&#xff0c;JavaScript1.1&#xff0c;JavaScript概述1.2&#xff0c;Java…

【人工智能学习笔记】人工智能里的数学1——概述

与软件开发相比&#xff0c;人工智能领域需要大量数学知识。主要涉及微积分、线性代数、概率论和最优化。本文主要介绍人工智能里用到了哪些数学知识&#xff0c;试图向您提供一个目录式的、导读式的概述。后期计划一一展开讲解。本文作为我学习人工智能的笔记&#xff0c;主要…

C++继承(上)

我们知道&#xff0c;面向对象有三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态。封装前面已经说过&#xff0c;这篇文章主要说说继承。 文章目录1.继承的概念及定义1.1继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符2. 基类和派生类对象赋值转换…

vue.js客服系统实时聊天项目开发(十四)点击加载展示历史消息列表

当访客一进去聊天界面以后&#xff0c;需要获取一下历史消息展示到界面&#xff0c;并且需要能分页的原理展示 在顶部有一个加载更多记录的按钮&#xff0c;点击就能按分页获取数据 //展示历史消息记录getHistoryList(){var _thisthis;let pagesize5;this.$axios.get(this.ApiH…

Python | 数据类型之列表

知识目录一、定义和遍历1.1 定义列表1.2 打印和截取列表1.3 遍历列表二、增删改查2.1 更新和删除列表2.3 脚本操作符 * in三、函数和方法3.1 函数3.2 方法列表是最常用的Python数据类型&#xff0c;它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型…

springboot-rocketmq整合NOT_CONSUME_YET问题处理

一、测试流程1.添加POM<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.1</version></dependency>2.配置属性参数# 默认的消息组 rocketmq.producer.…

微信小程序项目初试总结

微信小程序项目初试总结准备工作注册小程序账号获取AppID下载 微信开发者工具下载 HBuilderX安装 scss/sass 编译HBuilderX 的调试新建项目把项目运行到微信开发者工具使用 Git 管理项目把项目托管到码云模块制作通用tabBar首页分类搜索商品列表商品详情加入购物车购物车页面登…

【手把手教你C#如何使用SqlSugar操作MySQL数据库】三 SqlSugar使用案例

SqlSugar 连接数据库、创建数据表、增删改查用法1.SqlSugar 连接MySQL数据库1.创建数据库2.创建库中的数据表3.数据的插入4.数据的查询5.数据更新6.数据保存7.数据删除2.整体案例脚本代码1.SqlSugar 连接MySQL数据库 1.创建数据库 using SqlSugar; public class DB : Singlet…

Word数据恢复,简单几个方法恢复未保存的Word文档!

日常生活中&#xff0c;我们经常会用到Word文档&#xff0c;里面记录着我们很多重要内容。当遇到电脑死机、没电关机&#xff0c;或者是编辑文档的软件突然崩溃&#xff0c;我们又没有及时保存Word文档里面的数据&#xff0c;这时该怎么办&#xff1f;Word数据恢复&#xff0c;…

[LeetCode]2319. 判断矩阵是否是一个 X 矩阵

如果一个正方形矩阵满足下述 全部 条件&#xff0c;则称之为一个 X 矩阵 &#xff1a; 矩阵对角线上的所有元素都 不是 0矩阵中所有其他元素都是 0 给你一个大小为 n x n 的二维整数数组 grid &#xff0c;表示一个正方形矩阵。如果 grid 是一个 X 矩阵 &#xff0c;返回 true…

VX拜年红包测试用例设计分享

功能测试 1.红包最多可以输入的金额&#xff1b;2.红包一次性可以发送的最大个数3.在输入红包的钱数和个数时只能输入数字4.当余额不足时&#xff0c;红包发送失败5.发送的红包自己是否可以领取6.发送的红包别人是否可以领取7.红包超过 24 小时是否可以领取8.红包超时未领取&a…