代码随想录刷题】Day16 二叉树03

在这里插入图片描述

文章目录

  • 1.【104】二叉树的最大深度(优先掌握递归)
    • 1.1 前言
    • 1.2 题目描述
    • 1.3 递归法java代码实现
    • 1.4 迭代法java代码实现
    • 1.5 相关练习题【559】N叉树的最大深度
  • 2.【111】二叉树的最小深度(优先掌握递归)
    • 2.1 题目描述
    • 2.2 递归法java代码实现
    • 2.3 迭代法 java代码实现
  • 3.【222】完全二叉树的节点个数
    • 3.1 题目描述
    • 3.2 java代码实现

  • 【104】二叉树的最大深度
  • 【111】二叉树的最小深度
    • 【559】N叉树的最大深度
  • 【222】完全二叉树的节点个数

1.【104】二叉树的最大深度(优先掌握递归)

【104】二叉树的最大深度

1.1 前言

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

如图所示:

请添加图片描述

1.2 题目描述

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
在这里插入图片描述

1.3 递归法java代码实现

我们知道了二叉树的深度和高度,那么根节点的高度就是二叉树的最大深度,所以本题中我们可以通过后序遍历求的根节点高度来求二叉树的最大深度。

此题的递归三部曲

    1. 确定递归函数的参数和返回值

参数就是传入的树的根节点,返回这棵树的深度,所以返回值类型是int型

public int getDepth(TreeNode node)
    1. 确定终止条件

如果为空节点的话,就返回0,表示高度为0。

if (root == null) {return 0;
}
    1. 确定单层递归的逻辑

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

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

整体代码如下:

class solution {/*** 递归法*/public int maxDepth(TreeNode root) {if (root == null) {return 0;}int leftDepth = maxDepth(root.left);int rightDepth = maxDepth(root.right);return Math.max(leftDepth, rightDepth) + 1;}
}

1.4 迭代法java代码实现

使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。

在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示:
请添加图片描述

所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。

	/*** 迭代法*/
class Solution {public int maxDepth(TreeNode root) {Queue<TreeNode> que=new LinkedList<>();if (root==null){return 0;}que.offer(root);int depth=0;//深度while (!que.isEmpty()) {int len=que.size();for (int i=0;i<len;i++){TreeNode tempNode=que.poll();if (tempNode.left!=null){que.offer(tempNode.left);}if (tempNode.right!=null){que.offer(tempNode.right);}}depth++;}return depth;}
}

1.5 相关练习题【559】N叉树的最大深度

【559】N叉树的最大深度

class Solution {public int maxDepth(Node root) {if (root==null){return 0;}int maxChildDepth=0;List<Node> children=root.children;for (Node child : children) {int childDepth=maxDepth(child);maxChildDepth=Math.max(maxChildDepth,childDepth);}return maxChildDepth+1;}
}

2.【111】二叉树的最小深度(优先掌握递归)

【111】二叉树的最小深度

2.1 题目描述

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

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

说明:叶子节点是指没有子节点的节点。
在这里插入图片描述

2.2 递归法java代码实现

此题的重点在于读懂题意,理解最小深度最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
请添加图片描述

递归三部曲:

  • 1.确定递归函数的参数和返回值

参数为要传入的二叉树根节点,返回的是int类型的深度。

public int getDepth(TreeNode node)
  • 2.确定终止条件

终止条件也是遇到空节点返回0,表示当前节点的高度为0。

		if (node==null){return 0;}
  • 3.确定单层递归的逻辑
    • 如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。
    • 右子树为空,左子树不为空,最小深度是 1 + 左子树的深度
    • 最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。

遍历的顺序为后序(左右中),可以看出:求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。

整体代码如下:

class Solution {public int minDepth(TreeNode root) {return getDepth(root);}public int getDepth(TreeNode node){if (node==null){return 0;}int leftDepth=getDepth(node.left);int rightDepth=getDepth(node.right);//当一个左子树为空,右不为空,这时不是最低点if (node.left==null && node.right!=null){return rightDepth+1;}//当一个右子树为空,左不为空,这时不是最低点if (node.left!=null && node.right==null){return leftDepth+1;}int result=Math.min(leftDepth,rightDepth)+1;return result;}
}

2.3 迭代法 java代码实现

相对于 【104】二叉树的最大深度,本题还也可以使用层序遍历的方式来解决,思路是一样的。

需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。 如果其中一个孩子为空则不是最低点。

class Solution {public int minDepth(TreeNode root) {//迭代法/*** 相对于 104.二叉树的最大深度 ,* 本题还也可以使用层序遍历的方式来解决,思路是一样的。** 需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。* 如果其中一个孩子为空则不是最低点*/Queue<TreeNode> que = new LinkedList<>();if (root == null) {return 0;}que.offer(root);int depth = 0;while (!que.isEmpty()){int len = que.size();depth++;TreeNode tempNode = null;for (int i = 0; i < len; i++) {tempNode = que.poll();//如果当前节点的左右孩子都为空,直接返回最小深度if (tempNode.left == null && tempNode.right == null){return depth;}if (tempNode.left != null) que.offer(tempNode.left);if (tempNode.right != null) que.offer(tempNode.right);}}return depth;}
}

3.【222】完全二叉树的节点个数

【222】完全二叉树的节点个数

3.1 题目描述

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
在这里插入图片描述
提示:

  • 树中节点的数目范围是[0, 5 * 104 ]
  • 0 <= Node.val <= 5 * 104
  • 题目数据保证输入的树是 完全二叉树

3.2 java代码实现

class Solution {// 通用递归解法public int countNodes(TreeNode root) {if(root == null) {return 0;}return countNodes(root.left) + countNodes(root.right) + 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();while (size -- > 0) {TreeNode cur = queue.poll();result++;if (cur.left != null) queue.offer(cur.left);if (cur.right != null) queue.offer(cur.right);}}return result;}
}

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

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

相关文章

力扣每日一题-美化数组的最少删除数-2023.11.21

力扣每日一题&#xff1a;美化数组的最少删除数 开篇 今天的力扣每日一题居然写出来了&#xff0c;好开心&#xff0c;迫不及待地把题目分享出来&#xff0c;希望你也能把它狠狠拿下。 题目链接: 2216.美化数组的最少删除数 题目描述 代码思路 创建一个list集合来保存数组&a…

c语言上机作业:给函数增加防御机制

1.题目 2.思路 1.首先&#xff0c;我们可以知道&#xff0c;我们必须先要把z求出来&#xff0c;但这里需要注意的是x&#xff0c;y并不包含了全部的定义域&#xff0c;所以我们必须先判断是否输入的数据满足条件。而这&#xff0c;就是我们所需要突破的函数的防御&#xff0c;…

C++单调向量算法:132模式枚举1简洁版

本题不同解法 包括题目及代码C二分查找算法&#xff1a;132 模式解法一枚举3C二分查找算法&#xff1a;132 模式解法二枚举2代码简洁C二分查找算法&#xff1a;132 模式解法三枚举1性能最佳C单调向量算法&#xff1a;132 模式解法三枚举1代码更简洁C二分查找算法&#xff1a;1…

.nvmrc 文件使用详解

文章目录 1. 前言2. .nvmrc 是什么3. 创建 .nvmrc 文件4. 使用 .nvmrc 文件5. 终端自动切换版本 1. 前言 当开发多个项目时&#xff0c;每个项目运行环境要求的 node 版本不一样&#xff0c;那么我们就需要给每个项目指定 node 版本&#xff0c;也就是通过终端执行 nvm install…

Kafka-Producer

1、生产者 从编程的角度而言&#xff0c;生产者是一个消息的生产者&#xff0c;它负责创建消息并发送到Kafka集群中的一个或多个topic中。 1.1、客户端开发 一个正常的生产逻辑需要具备以下几个步骤&#xff1a; 配置生产者客户端参数及创建相应的生产者实例构建待发送的消…

风丘电动汽车热管理方案 为您的汽车研发保驾护航

热管理技术作为汽车节能、提高经济性和保障安全性的重要措施&#xff0c;在汽车研发过程中具有重要作用。传统燃油汽车的热管理系统主要包括发动机、变速器散热系统和汽车空调&#xff0c;而电动汽车的热管理系统在燃油汽车热管理架构的基础之上&#xff0c;又增加了电机电控热…

存储服务器特征是什么

存储服务器和普通服务器是有差别的&#xff0c;配置方式不同&#xff0c;因为存储服务器是为特定目标设计的&#xff0c;通常存储服务器是独立的单元&#xff0c;大多数时候是被设计成4U机架式&#xff0c;存储服务器一般是单机运作的&#xff0c;不与其他服务器连接。今天小编…

Android HAL学习 及 与BSP的区别

Android HAL学习 及 与BSP的区别 参考链接&#xff1a; 1、https://www.cnblogs.com/looner/articles/11579335.html 2、https://blog.csdn.net/leesan0802/article/details/124087630 3、https://zhuanlan.zhihu.com/p/336531442 在HAL的学习之前&#xff0c;我们来先了解…

SPASS-指数平滑法

基本概念及统计原理 基本概念 指数平滑法的思想来源于对移动平均预测法的改进。指数平滑法的思想是以无穷大为宽度&#xff0c;各历史值的权重随时间的推移呈指数衰减&#xff0c;这样就解决了移动平均的两个难题。 统计原理 简单模型 Holt线性趋势模型 案例 为了研究上海市…

数据结构(c语言版) 树的遍历

作业要求 以如下图为例&#xff0c;完成树的遍历&#xff1a; 1、利用孩子兄弟表示法的存储结构 2、利用先根序列创建树 3、先根遍历树 4、后根遍历树 思考 预期的结果应该为&#xff1a; 1、先根创建树时需要输入的数据为&#xff1a; A B E 0 F 0 0 C 0 D G 0 0 0 0 2、…

Linux 文件类信息统计指令(awk、sort、wc -l)

wc -l cat file |grep -o word |wc -l 统计file文件中word这个关键字出现的个数 cat file |grep word |wc -l 统计file文件中word这个关键字出现的行数 AWK awk 是一种脚本语言&#xff0c;用于处理或分析文本文件。或者我们可以说&#xff0c;awk 命令主要用于根据列或字段…

七、HDFS文件系统的存储原理

1、总结 之所以把总结放在文件开头&#xff0c;是为了让读者对这篇文章有更好的理解&#xff0c;&#xff08;其实是因为我比较懒……&#xff09; 对于整个HDFS文件系统的存储原理&#xff0c;我们可以总结为一句话&#xff0c;那就是&#xff1a; 分块备份 2、存储结构和问题…

使用Navicat将SQL server数据库导入mysql数据库

使用Navicat将SQL server数据库导入mysql数据库 1、使用Navicat Premium打开MySql数据库&#xff0c;然后新建一个数据库名&#xff08;该数据库名称为需要从SqlServer数据库导过来的名称&#xff0c;mysql只有小写&#xff0c;不影响&#xff09; 比如需要将SqlServer数据库…

Linux IIC 驱动实验

一、引言 随着嵌入式系统的快速发展&#xff0c;IIC&#xff08;Inter-Integrated Circuit&#xff09;总线已经成为一种常见的通信协议&#xff0c;广泛应用于各种嵌入式设备中。在Linux操作系统中&#xff0c;IIC总线驱动程序是实现设备间通信的关键。本文将介绍一个基于Linu…

计数排序+桶排序 详讲(思路+图解+代码详解)

文章目录 计数排序和桶排序一、计数排序概念&#xff1a;写法一&#xff1a;写法二&#xff1a; 二、桶排序概念代码 计数排序和桶排序 一、计数排序 时间复杂度&#xff1a;空间复杂度&#xff1a;稳定性&#xff1a;稳定 概念&#xff1a; 非基于比较的排序 计数排序又称为…

PACS系统源码,WORKLIST数字化工作流程,影像数字化存储,电子报告书写、胶片打印

PACS系统源码 可与医院HIS、LIS无缝连接 PACS系统以实现医学影像数字化存储、诊断为核心任务&#xff0c;从医学影像设备&#xff08;如CT、CR、DR、MR、DSA、RF等&#xff09;获取影像&#xff0c;集中存储、综合管理医学影像及病人相关信息&#xff0c;建立数字化工作流程。 …

文章系列2:Unraveling the functional dark matter through global metagenomics

这篇文章发布于2023年10月nature。通讯作者是来自于 DOE Joint Genome Institute, Lawrence Berkeley National Laboratory, Berkeley, CA, USA. 背景介绍&目标 作者首先背景介绍了两种主流宏基因组分析方法&#xff0c;包括reads-based reference mapping&#xff08;eg…

Reactive.Net绑定Subscribe调用wpf控件报错

使用.ObserveOnDispatcher()解决&#xff0c;nuget安装ReactiveUI.WPF 参考 winforms - Rx Example not working - Stack Overflow

openssl+ SM2 + linux 签名开发实例(C++)

文章目录 一、SM2 签名理论基础二、SM2签名开发实例 一、SM2 签名理论基础 SM2是中国国家密码管理局发布的椭圆曲线密码算法标准&#xff0c;用于数字签名、密钥交换和公钥加密等安全通信场景。以下是SM2签名的理论基础相关知识点&#xff1a; 椭圆曲线密码学&#xff08;Elli…

为gnustep项目移植到wsl的过程

仔细研读/usr/share/GNUStep/Makefiles下的很多makefile文件的一些变量定义 然后开始整理代码&#xff0c;各个文件存放到自定义的文件夹&#xff0c;方便管理 修改GNUMakefile, 这里要研读很多Makefile 文件的变量定义&#xff0c;修正自己的赋值 一个尝试例子: https://gi…