算法练习第17天|104.二叉树的最大深度 、559.N叉树的最大深度

 104.二叉树的最大深度

104. 二叉树的最大深度 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/

什么是二叉树的深度和高度?

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。最大深度==二叉树的层数==根节点的深度==根节点的高度==第二层节点的最大高度+1。

二叉树某个节点的深度:指从根节点到该节点的最长简单路径边的条数。

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

题目描述:

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

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

思路分析:

本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。

后序递归解法

下面先尝试使用后序递归实现最大深度的求法。

递归第一步:确认递归函数的参数和返回值。题目已经给出,参数为二叉树的根节点指针,返回值为最大深度,所以返回值类型为int。

int maxDepth(TreeNode* root){}

递归第二步:确认终止条件。那就是如果传入的root为nullptr,则返回0。即递归结束的条件为空树,即没有子树可以继续下一层的递归。

if(root == nullptr) return 0;

递归第三步:确认单层递归逻辑。按照该思路,在单层递归时应该分别统计当前root(可以时根节点,也可以是子树的根节点)的左右子树的最大高度,然后取两者中的最大值。则当前root的深度为两者中的最大值+1,即:

//左子树的高度
int left = maxDepth(root->left);
//右子树的高度
int right = maxDepth(root->right);int depth = max(left, right) + 1;  //中
return depth;

后序整体代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public://采用后序递归遍历int maxDepth(TreeNode* root) {if(root == nullptr) return 0;//左子树的高度int left = maxDepth(root->left);  //左//右子树的高度int right = maxDepth(root->right);  //右int depth = max(left, right) + 1;  //中return depth;}
};

层序遍历解法

由于二叉树的最大深度就是二叉树的层数,所以使用前文所讲的层序遍历来计算深度(层数)。具体代码如下:

class Solution {
public://采用层序遍历int maxDepth(TreeNode* root) {if(root == nullptr) return 0;queue<TreeNode*> que;que.push(root);int depth = 0;while(!que.empty()){            int size= que.size(); //当前层存在,深度++++depth;   //遍历当前层各节点        for(int i=0; i<size; i++){//去每一层的各节点必须放在for循环里TreeNode *node = que.front();que.pop();if(node->left)  que.push(node->left);if(node->right)  que.push(node->right);}}return depth;}
};

前序递归解法

最后介绍一下前序解法,我理解来比较困难,大家可以看一下:

class solution {
public:int result;void getdepth(TreeNode* node, int depth) {result = depth > result ? depth : result; // 中if (node->left == NULL && node->right == NULL) return ;if (node->left) { // 左depth++;    // 深度+1getdepth(node->left, depth);depth--;    // 回溯,深度-1}if (node->right) { // 右depth++;    // 深度+1getdepth(node->right, depth);depth--;    // 回溯,深度-1}return ;}int maxDepth(TreeNode* root) {result = 0;if (root == NULL) return result;getdepth(root, 1);return result;}
};

559.N叉树的最大深度

559. N 叉树的最大深度 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-depth-of-n-ary-tree/description/

题目描述:

给定一个 N 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:3

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:5

有了前面二叉树的解法,下面直接给出后序递归解法:

后序递归解法

/*
// Definition for a Node.
class Node {
public:int val;vector<Node*> children;Node() {}Node(int _val) {val = _val;}Node(int _val, vector<Node*> _children) {val = _val;children = _children;}
};
*/class Solution {
public:int maxDepth(Node* root) {if(root == nullptr) return 0;int depth = 0;for(int i = 0; i < root->children.size(); ++i){int children_i_depth = maxDepth(root->children[i]);depth = max(children_i_depth, depth) ;  //注意,这里只找子树的最大高度}return depth+1;  //深度是在子树最大高度的基础上加1}
};

层序遍历解法:

class Solution {
public:int maxDepth(Node* root) {if(root == nullptr) return 0;int depth = 0;queue<Node *> que;que.push(root);while(!que.empty()){int size = que.size();++depth;for(int i = 0; i<size; i++){Node * node = que.front();que.pop();for(int j = 0;j < node->children.size();j++){if(node->children[j] != nullptr)que.push(node->children[j]);}}            }return depth;}
};

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

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

相关文章

C语言复习1

1.stdint.h C99库的作用是统一类型别名&#xff0c;例如要定义一个有符号的整数类型&#xff0c;即输入int32_t。 2.位操作 3.宏定义 格式&#xff1a;define 标识符 字符串 标识符&#xff1a;宏定义的名字 字符串&#xff1a;常数&#xff0c;表达式&#xff0c;格式串等 …

入侵检测数据预处理 特征工程 面临的问题

数据预处理 对于分类任务来说,由于原始数据可能存在异常、缺失值以及不同特征的取值范围差 异大等问题,对机器学习会产生影响,因此,在进行机器学习模型训练之前,需要先对数据 进行预处理。数据预处理的主要过程包括数据清洗、去量纲、离散化等。 1.数据清洗 对采集到的数据进行…

记录Python的numpy库的详解

1.数组 list[1,2] 转变成np的形式,转换成对像后&#xff0c;就可以使用很多的np自带的方法了 list1[1,2] anp.array(list1) #a--->array([1, 2]) a.dtype #-->dtype(int32) 2. list1[1,2] ,list2[3.1,4,2],anp.array([list1,list2]) list1,list2[1,2],[3.1,4.2] anp.a…

Element-Ui的Form表单:Label文本两端对齐,且必填项的*不影响布局

1. HTML 结构 首先&#xff0c;确保你的 HTML 或 Vue 模板中有一个 el-form 组件&#xff0c;类似下面这样&#xff1a; <div id"app"><el-form :model"form" label-width"100px"><el-form-item label"用户名">&l…

接口测试框架搭建D22

整体架构和分层设计 run.py 运行测试用例&#xff0c;生成测试报告 test_cases/ 登录用例 注册用例 其他业务用例... data/ 测试数据 libs 第三方插件&#xff0c;比如HTMLTestRunnerNew config config.yaml 静态配置数据 config.py 动态配置数据 reports 测试报告…

Mac搭建Java环境【环境搭建】

Mac搭建Java环境【环境搭建】 1 安装Java SDK 官网地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ 下载dmg&#xff0c;双击之后无脑安装即可。 # 进入 JDK 安装目录 cd /Library/Java/JavaVirtualMachines# 查看文件 ls# 输入 cd ~# 打开环…

代码随想录训练营第三十五期|第天15|二叉树part02|层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2

102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode…

DG怎样手动切主从-用普通命令方式(不用dg broker)

这里主库是orcl&#xff0c;从库是orclstd 一 将主库降为从库 1.1查看主库SWITCHOVER_STATUS的状态 #确认主库是否可以做switchover #不能切换的情况 SQL>SELECT SWITCHOVER_STATUS FROM V$DATABASE; SWITCHOVER_STATUS ------------------ SESSIONS ACTIVE 在这种…

别踩白块web小游戏

整体思路 1.设置一个游戏界面main&#xff08;最外面一圈方框&#xff09; 2.main内部放置一个容器container&#xff0c;容器非常长&#xff0c;且容器底部位于main的顶部 3.将容器内的黑块和白块事先处理好&#xff0c;并将黑块存储在黑块数组中 容器黑白块处理&#xf…

【开发问题记录】Nacos修改服务实例权重时报错

问题记录 一、问题描述1.1 产生原因1.2 产生问题 二、问题解决2.1 docker部署的nacos解决方案2.1.1 进入nacos容器2.1.2 查看当前目录2.1.3 进入data文件夹2.1.4 删除protocol文件2.2 本地部署的nacos 一、问题描述 1.1 产生原因 在运行项目时&#xff0c;在本地启动了一个服务…

vue3项目 使用 element-plus 中 el-collapse 折叠面板

最近接触拉了一个项目&#xff0c;使用到 element-plus 中 el-collapse 折叠面板&#xff0c;发现在使用中利用高官网多多少少的会出现问题。 &#xff08;1.直接默认一个展开值&#xff0c;发现时显时不显 2 . 数据渲染问题&#xff0c;接口请求了&#xff0c;页面数据不更新 …

js 截取指定字符后面/前面的所有字符串...

项目场景 在 JavaScript 中&#xff0c;你可以使用 substring() 或 substr() 方法来截取字符串中指定字符前面或后面的所有字符。 再配合**indexOf()**方法来判断字符所在的位置从而实现截取指定字符的前后字符串 解决方案&#xff1a; //js 截取指定字符后面/前面的所有字…

类激活映射详解

类激活映射&#xff08;CAM, Class Activation Mapping&#xff09;是一种常用于卷积神经网络&#xff08;CNN&#xff09;的技术&#xff0c;用来识别和解释模型在进行图像或时间序列分类任务时&#xff0c;哪些区域对最终分类决定起到了关键作用。下面&#xff0c;我将详细解…

大数据平台搭建2024(一)

一&#xff1a;基础配置 创建虚拟机并查出ip地址进行连接 ip a1.配置node01静态ip地址与主机名 vi /etc/sysconfig/network-scripts/ifcfg-ens33修改或添加如下内容&#xff1a; BOOTPROTO"static" ONBOOTyes #根据虚拟机网卡信息配置 IPADDR192.168.200.141 NET…

360度VR全景汽车漫游展示让爱车者能感受真实的驾驶体验

小米汽车的惊艳亮相&#xff0c;让无数爱车族心潮澎湃。然而&#xff0c;对于因时间和地理限制无法亲临现场的人来说&#xff0c;这份激动或许带有些许遗憾。如今&#xff0c;有了3D虚拟看车软件&#xff0c;这一切不再是问题。 web3D开发公司深圳华锐视点通过运用尖端的web3D开…

IntelliJ IDEA2024 安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 IDEA&#xff08;Integrated Development Environment for Apache&#xff09; 是一款专为 Apache 开发者设计的集成开发环境。该软件提供了丰富的功能和工具&#xff0c;帮助开发者更高效地创建、调试和部署 Apache 项目。 主…

hot100 -- 链表(中)

不要觉得力扣核心代码模式麻烦&#xff0c;它确实比不上ACM模式舒服&#xff0c;可以自己处理输入输出 只是你对 链表 和 return 的理解不到位 &#x1f442; ▶ 屿前世 (163.com) &#x1f442; ▶ see you tomorrow (163.com) 目录 &#x1f382;两数相加 &#x1f6a9;删…

python 绘制六种激活函数(sigmoid、tanh、relu、softmax、relu、elu)

1、效果 2、实现代码&#xff08;带注释&#xff09; import numpy as np # 导入 numpy 库, 用于数学运算 import matplotlib.pyplot as plt # 导入 matplotlib.pyplot, 用于绘图 import matplotlib as mpl # 导入 matplotlib 库, 用于图形配置plt.rcParams[font.sans-se…

mysql奇葩问题union

单独执行第一条&#xff0c;有三条结果&#xff1b; union之后&#xff0c;只有一条结果&#xff1b; union自动的把重复数据合并了&#xff1b;

使用Python生成100到算术题

需求描述&#xff1a;生成100道包含加法、减法、乘法、除法题目的数学题。 import random import pandas as pddef generate_math_questions(num_questions, question_types[addition, subtraction, multiplication, division], difficultyeasy, range_start1, range_end10):&…