C++力扣题目104--二叉树的最大深度

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

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

说明: 叶子节点是指没有子节点的节点。

示例: 给定二叉树 [3,9,20,null,null,15,7],

104. 二叉树的最大深度

返回它的最大深度 3 。

思路

看完本篇可以一起做了如下两道题目:

  • 104.二叉树的最大深度(opens new window)
  • 559.n叉树的最大深度(opens new window)

#递归法

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

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

而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。

这一点其实是很多同学没有想清楚的,很多题解同样没有讲清楚。

我先用后序遍历(左右中)来计算树的高度。

  1. 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。

代码如下:

int getdepth(TreeNode* node)

1

  1. 确定终止条件:如果为空节点的话,就返回0,表示高度为0。

代码如下:

if (node == NULL) return 0;

  1. 确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。

代码如下:

int leftdepth = getdepth(node->left);       // 左
int rightdepth = getdepth(node->right);     // 右
int depth = 1 + max(leftdepth, rightdepth); // 中
return depth;

所以整体c++代码如下:

class solution {
public:int getdepth(TreeNode* node) {if (node == NULL) return 0;int leftdepth = getdepth(node->left);       // 左int rightdepth = getdepth(node->right);     // 右int depth = 1 + max(leftdepth, rightdepth); // 中return depth;}int maxDepth(TreeNode* root) {return getdepth(root);}
};

代码精简之后c++代码如下:

class solution {
public:int maxDepth(TreeNode* root) {if (root == null) return 0;return 1 + max(maxDepth(root->left), maxDepth(root->right));}
};

精简之后的代码根本看不出是哪种遍历方式,也看不出递归三部曲的步骤,所以如果对二叉树的操作还不熟练,尽量不要直接照着精简代码来学。

本题当然也可以使用前序,代码如下:(充分表现出求深度回溯的过程)

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;}
};

可以看出使用了前序(中左右)的遍历顺序,这才是真正求深度的逻辑!

注意以上代码是为了把细节体现出来,简化一下代码如下:

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) { // 左getdepth(node->left, depth + 1);}if (node->right) { // 右getdepth(node->right, depth + 1);}return ;}int maxDepth(TreeNode* root) {result = 0;if (root == 0) return result;getdepth(root, 1);return result;}
};

#迭代法

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

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

层序遍历

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

如果对层序遍历还不清楚的话,可以看这篇:二叉树:层序遍历登场!(opens new window)

c++代码如下:

class solution {
public:int maxDepth(TreeNode* root) {if (root == NULL) return 0;int depth = 0;queue<TreeNode*> que;que.push(root);while(!que.empty()) {int size = que.size();depth++; // 记录深度for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return depth;}
};

那么我们可以顺便解决一下n叉树的最大深度问题

#相关题目推荐

#559.n叉树的最大深度

力扣题目链接(opens new window)

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

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

例如,给定一个 3叉树 :

559.n叉树的最大深度

我们应返回其最大深度,3。

#思路

依然可以提供递归法和迭代法,来解决这个问题,思路是和二叉树思路一样的,直接给出代码如下:

#递归法

c++代码:

class solution {
public:int maxDepth(Node* root) {if (root == 0) return 0;int depth = 0;for (int i = 0; i < root->children.size(); i++) {depth = max (depth, maxDepth(root->children[i]));}return depth + 1;}
};

#迭代法

依然是层序遍历,代码如下:

class solution {
public:int maxDepth(Node* root) {queue<Node*> que;if (root != NULL) que.push(root);int depth = 0;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]) que.push(node->children[j]);}}}return depth;}
};

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

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

相关文章

【C++11/C++17】左值与右值

左值和右值是C中的两个重要概念&#xff0c;它们涉及到变量的存储位置和生命周期。 左值&#xff08;Lvalue&#xff09; 左值表示一块具有确定地址的内存单元。它表示一个具体的、明确存在的存储单元。可以被取地址运算符&#xff08;&&#xff09;获取其地址。变量、数…

pytorch详细探索各种cnn卷积神经网络

目录 torch.nn.functional子模块详解 conv1d 用法和用途 使用技巧 适用领域 参数 注意事项 示例代码 conv2d 用法和用途 使用技巧 适用领域 参数 注意事项 示例代码 conv3d 用法和用途 使用技巧 适用领域 参数 注意事项 示例代码 conv_transpose1d 用法…

electron+vue编辑Office Word?

Electron 桌面应用是基于 Chromium 内核的&#xff0c;而谷歌Chrome取消了对PPAPI插件支持后&#xff0c;在线Office方案纷纷失效&#xff0c;只能更换国产浏览器在低版本浏览器苟延残喘&#xff0c;不能用于electronvue项目。 经过小编不断的寻找&#xff0c;终于找到一款至今…

redis主从复制、哨兵与集群

目录 一、概述 二、redis主从复制 1、概念 2、主从复制的作用 3、主从复制流程 4、搭建Redis 主从复制实验 ①在三台服务器上安装redis &#xff08;1&#xff09;关闭防火墙和安全机制 &#xff08;2&#xff09;修改内核参数 &#xff08;3&#xff09;安装redis …

自旋框的使用

1. 自旋框 实例化 //实例化单精度自旋框QSpinBox* spinBox new QSpinBox(this);//实例化双精度自旋框QDoubleSpinBox* doubleSpinBox new QDoubleSpinBox(this);1.1 单精度自旋框 QSpinBox 1.1.1 单精度自旋框的基本函数 QSpinBox_QDoubleSpinBox Dialog.cpp #include "…

网络安全保险发展起始阶段的挑战及应对措施

文章目录 前言一、网络安全保险的有序发展二、当前我国网络安全保险发展的初期态势&#xff08;一&#xff09;网络安全风险类型&#xff08;二&#xff09;网络安全保险的作用&#xff08;三&#xff09;与外国网络安全保费的规模对比 三、我国网络安全保险发展初期面临的挑战…

vue中常用的指令修饰符

vue中常用的指令修饰符有哪些 在Vue.js中&#xff0c;指令修饰符用于在指令后面以点号&#xff08;.&#xff09;形式添加特殊后缀&#xff0c;以表示对指令的特定行为或修饰。 以下是一些常用的Vue.js指令修饰符&#xff1a; 1. v-on &#xff08;&#xff09;指令修饰符&am…

vue/vue3/js来动态修改我们的界面浏览器上面的文字和图标

前言&#xff1a; 整理vue/vue3项目中修改界面浏览器上面的文字和图标的方法。 效果&#xff1a; vue2/vue3: 默认修改 public/index.html index.html <!DOCTYPE html> <html lang"en"><head><link rel"icon" type"image/sv…

报考PMI-ACP总费用是多少?费用明细!

ACP认证是由美国项目管理协会&#xff08;PMI&#xff09;推出的针对敏捷项目管理专业人士的资格认证&#xff0c;由于其高含金量受到了不少小伙伴的追捧。那么这个证书考试费多少钱呢&#xff1f;贵不贵呢&#xff1f;我们来一起探讨下。 PMI-ACP认证考试费用分为三个部分&am…

PostgreSQL 低级错误集锦 (不定时更新)

低级错误真的浪费时间且菜&#xff0c;希望不再犯低级重复错误。 1.to_date()函数日期转换报错 SQL语句&#xff1a; SELECT job_date FROM data_check WHERE data_type S; 查询结果&#xff1a; job_date | ---------- 2023-01-28| 我希望用update语句更新job_date字段&…

golang中的字符串拼接

go中常见的字符串拼接方法 假设我们现在要实现这样一个拼接函数&#xff1a; 将字符串重复n次拼接起来&#xff0c;返回一个新字符串。 方法一&#xff1a;使用运算符 func simpleSplice(s string, n int) string {newStr : ""for i : 0; i < n; i {newStr s}…

一种基于嵌入式的卫星基带信号处理系统的制作方法

一种基于嵌入式的卫星基带信号处理系统的制作方法 随着卫星通信技术的不断发展&#xff0c;卫星基带信号处理系统的性能和稳定性要求也越来越高。传统的卫星基带信号处理系统通常采用分立器件和通用处理器&#xff0c;存在着体积庞大、功耗高、集成度低等问题。为了解决这些问题…

C++_vector类

目录 一、vector的模拟实现 1、vector的组成结构 2、vector尾插数据 2.1 析构函数 3、迭代器实现 4、resize 5、删除数据 5.1 迭代器失效 6、指定位置插入数据 6.1 迭代器失效 7、迭代器构造和resize构造 8、深浅拷贝 结语&#xff1a; 前言&#xff1a; vect…

Linux踢掉远程用户

在Linux系统中&#xff0c;要踢掉远程用户&#xff0c;可以使用以下步骤&#xff1a; 首先&#xff0c;使用 who 或 w 命令查看当前登录的用户及其相关信息&#xff0c;包括IP地址和终端&#xff08;TTY&#xff09;。例如&#xff0c;输入 who 或 w 后回车。找到要踢掉的用户…

vue前端开发自学demo-input标签数据双向绑定

vue前端开发自学demo-input标签数据双向绑定&#xff01;今天为大家 展示的内容是&#xff0c;前端开发常见的&#xff0c;form表单里面的&#xff0c;一些输入数据的元素&#xff0c;动态绑定数据的案例。比如input,以及checkbox的状态绑定案例。 首先&#xff0c;老规矩&…

掌握私域运营的四大原则,助你打造精准营销

随着互联网的发展和竞争的加剧&#xff0c;企业越来越重视私域运营的重要性。私域运营可以帮助企业与用户建立更紧密的联系&#xff0c;提高用户忠诚度和粘性&#xff0c;从而为企业带来更多的商业价值。在进行私域运营时&#xff0c;以下四大原则是必须要知道的。 第一、价值…

【人工智能Ⅰ】实验11:支持向量机

实验11 支持向量机 一、实验目的 1&#xff1a;了解支持向量机的结构和原理。 2&#xff1a;应用支持向量机建立训练模型&#xff0c;对模型进行评估。 二、实验内容和要求 【实验内容】 选择支持向量机&#xff0c;对花卉图像或玉米果穗图像进行分类。花卉图像包括玫瑰&a…

关于LINUX操作系统异常宕机重启的分析思路

一、先搞清楚现状 当收到系统宕机告警或者故障反馈时&#xff0c;需要先对情况进行核实。比如检查系统启动时间&#xff0c;是不是真实发生了重启&#xff1f;如果重启了&#xff0c;什么时间点发生的重启&#xff1f;重启了几次&#xff1f;重启之前有无变更操作&#xff1f;…

JavaScript-2

运算符 赋值运算符 -*/% 一元运算符 自增 let num 0 num // 或者 num符号&#xff1a; 作用&#xff1a;让变量的值 1自减 let num 0 num-- // 或者 --num符号&#xff1a;-- 作用&#xff1a;让变量的值 -1比较运算符 符号描述>左边是否大于右边<左边是否小于右…

PyTorch|构建自己的卷积神经网络——nn.Sequential()

之前在构建神经网络时&#xff0c;我们一般是采用这种方式&#xff0c;就像这样&#xff1a; class Network1(nn.Module): def __init__(self): super(Network1,self).__init__() self.conv1 nn.Conv2d(in_channels3, out_channels6, kernel_size5) …