【算法与数据结构】104、111、LeetCode二叉树的最大/最小深度

文章目录

  • 一、题目
  • 二、层序遍历法
  • 三、递归法
  • 四、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述
在这里插入图片描述

二、层序遍历法

  思路分析:两道题都可以用层序遍历(迭代法)来做,遍历完一层深度变量depth就++。找最小深度实际上等价于找离根节点最近的叶子节点,我们在遍历每一个节点时,判断它的左右节点是否为空,若为空则为叶子节点,输出此时的depth。
  找最大深度程序如下

class Solution {
public:// 找最大深度int maxDepth(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);int Depth = 0, size = 0;    // 根节点深度定义为1while (!que.empty()) {Depth++;size = que.size();      // size必须固定, que.size()是不断变化的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;}
};

  找最小深度程序如下

class Solution2 {
public:// 找最小深度int minDepth(TreeNode* root) {if (!root) return 0;queue<TreeNode*> que;que.push(root);int Depth = 0, size = 0;    // 根节点深度定义为1while (!que.empty()) {Depth++;size = que.size();      // size必须固定, que.size()是不断变化的for (int i = 0; i < size; ++i) {TreeNode* node = que.front();que.pop();if (node->left == NULL && node->right == NULL) return Depth;if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return Depth;}
};

三、递归法

  当然,这道题也可以用递归法实现。一般的递归法我们需要注意三个点:

  • 1、输入参数和返回值
  • 2、确定终止条件
  • 3、确定单层递归逻辑
      找最大深度程序如下,程序当中终止条件为节点为NULL,返回0,表示深度为0。依次寻找左右节点的深度,然后当前节点的最大深度为左右节点最大值+1(+1是因为算上当前中间节点)。
class Solution3 {
public:// 找最大深度int getDepth(TreeNode* root) {if (!root) return 0;int leftdepth = getDepth(root->left);int rightdepth = getDepth(root->right);int depth = 1 + max(leftdepth, rightdepth);return depth;}int maxDepth(TreeNode* root) {return getDepth(root);}
};

  精简版本如下

class Solution3 {
public:// 递归法找最大深度,简化版int maxDepth(TreeNode* root) {if (!root) return 0;return 1 + max(maxDepth(root->left), maxDepth(root->right));}
};

四、完整代码

# include <iostream>
# include <vector>
# include <queue>
# include <string>
# include <algorithm>
using namespace std;// 树节点定义
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) {queue<TreeNode*> que;if (root != NULL) que.push(root);int Depth = 0, size = 0;    // 根节点深度定义为1while (!que.empty()) {Depth++;size = que.size();      // size必须固定, que.size()是不断变化的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;}
};class Solution2 {
public:// 找最小深度int minDepth(TreeNode* root) {if (!root) return 0;queue<TreeNode*> que;que.push(root);int Depth = 0, size = 0;    // 根节点深度定义为1while (!que.empty()) {Depth++;size = que.size();      // size必须固定, que.size()是不断变化的for (int i = 0; i < size; ++i) {TreeNode* node = que.front();que.pop();if (node->left == NULL && node->right == NULL) return Depth;if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return Depth;}
};//class Solution3 {
//public:
//    // 递归法找最大深度
//    int getDepth(TreeNode* root) {
//        if (!root) return 0;
//        int leftdepth = getDepth(root->left);
//        int rightdepth = getDepth(root->right);
//        int depth = 1 + max(leftdepth, rightdepth);
//        return depth;
//    }
//    int maxDepth(TreeNode* root) {
//        return getDepth(root);
//    }
//};class Solution3 {
public:// 递归法找最大深度,简化版int maxDepth(TreeNode* root) {if (!root) return 0;return 1 + max(maxDepth(root->left), maxDepth(root->right));}
};void my_print(vector <string>& v, string msg)
{cout << msg << endl;for (vector<string>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << "  ";}cout << endl;
}// 前序遍历迭代法创建二叉树,每次迭代将容器首元素弹出(弹出代码还可以再优化)
void Tree_Generator(vector<string>&t, TreeNode* &node) {if (t[0] == "NULL" || !t.size()) return;    // 退出条件else {node = new TreeNode(stoi(t[0].c_str()));    // 中t.assign(t.begin() + 1, t.end());Tree_Generator(t, node->left);              // 左t.assign(t.begin() + 1, t.end());Tree_Generator(t, node->right);             // 右}
}int main()
{vector<string> t = { "3", "9", "NULL", "NULL", "20", "15", "NULL", "NULL", "7", "NULL", "NULL"};   // 前序遍历my_print(t, "目标树");TreeNode* root = new TreeNode();Tree_Generator(t, root);Solution3 s1;int result = s1.maxDepth(root);cout << "最大深度为:" << result << endl;system("pause");return 0;
}

end

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

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

相关文章

帮助中心内容需要囊括什么?(内含案例分享)

给产品制作一个帮助中心&#xff0c;让用户能够通过访问帮助中心查看产品相关内容&#xff0c;尽快了解产品&#xff0c;熟悉操作。不仅仅局限于售后&#xff0c;在售中售前都能够发挥很大的作用&#xff0c;帮助用户全面了解产品&#xff0c;减少销售的工作量&#xff0c;节约…

Zookeeper命令总结

目录 1、常用命令2、ls path3、create xxx创建持久化节点创建临时节点创建持久化序列节点 4、get path5、set path6、delete path7、监听器总结1&#xff09;节点的值变化监听2&#xff09;节点的子节点变化监听&#xff08;路径变化&#xff09;3&#xff09;当某个节点创建或…

最优化方法

一. 图论 1.最小生成树 图的生成树是它的一颗含有其所有顶点的无环连通子图,一 幅加权图的最小生成树(MST)是它的一颗权值(树中的所有边的权值之和) 最小的生成树 • 适用场景&#xff1a;道路规划、通讯网络规划、管道铺设、电线布设等 题目数据 kruskal算法 稀疏图&#x…

oracle单个用户最大连接数限制

项目经理反馈&#xff0c;现场已做了单个用户的最大连接数2000的限制&#xff0c;但数据库还是报无法连接&#xff0c;故障用户的连接数已3800多了。 查看日志报错如下 2023-07-20T13:07:57.79465308:00 Process m000 submission failed with error 20 Process m000 submiss…

HDFS的设计目标和重要特性

HDFS的设计目标和重要特性 设计目标HDFS重要特性主从架构分块存储机制副本机制namespace元数据管理数据块存储 设计目标 硬件故障(Hardware Failure)是常态&#xff0c;HDFS可能有成百上千的服务器组成&#xff0c;每一个组件都有可能出现故障。因此古见检测和自动快速恢复的H…

梯度提升树的基本思想

目录 1. 梯度提升树 VS AdaBoost 2. GradientBoosting回归与分类的实现 2.1 GradientBoosting回归 2.2 GradientBoosting分类 1. 梯度提升树 VS AdaBoost 梯度提升树&#xff08;Gradient Boosting Decision Tree&#xff0c;GBDT&#xff09;是提升法中的代表性算法&#…

帆软报表设计器设置步骤

1、连接工作目录&#xff08;可以是远程服务器&#xff09; 在打开的界面中设置具体的远程地址 一个报表文件可以有多个数据集、但是数据集依附于报表文件的存在&#xff0c;不能跨报表共享。 先补充这么多&#xff0c;有遇到问题再写一点。 &#xff08;完&#xff09;

Cpp 01 — namespace命名空间、C++的输入与输出、缺省参数、函数重载、引用、隐式类型转换

前言&#xff1a;本文章主要用于个人复习&#xff0c;追求简洁&#xff0c;感谢大家的参考、交流和搬运&#xff0c;后续可能会继续修改和完善。 因为是个人复习&#xff0c;会有部分压缩和省略。 一、namespace命名空间 C使用命名空间(namespace)来避免命名冲突。 在定义一个…

STM32CUBUMX配置RS485(中断接收)--保姆级教程

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子&#xff0c;使用STM32CUBEMX做了很多驱动&#x…

Vue mixin 混入

可以复用的组件&#xff0c;我们一般会抽离&#xff0c;写成公共的模块。 可以复用的方法&#xff0c;我们一般会抽离&#xff0c;写成公共的函数。 那么 在 Vue 中&#xff0c;如果 某几个组件实例 VueComponent 中、或者 整个 Vue 项目中 都存在相同的配置&#xff0c;那就…

firefox笔记-Centos7离线安装firefox

目前&#xff08;2023-03-22 16:41:35&#xff09;Centos7自带的firefox已经很新了是2020年的。主要原因是有个web项目&#xff0c;用2020年的firefox打不开。 发到互联网上是2023-07-24。 报错是js有问题&#xff0c;估计是搞前端的只做了chrome适应&#xff0c;没做firefox…

Spring使用注解进行对象装配(DI)

文章目录 一. 什么是对象装配二. 三种注入方式1. 属性注入2. 构造方法注入3. Setter注入 三. 三种注入方式的优缺点四. 综合练习 通过五大类注解可以更便捷的将对象存储到 Spring 中&#xff0c;同样也可以使用注解将已经储存的对象取出来&#xff0c;直接赋值到注解所在类的一…

ATTO488 NHS ester ,新型亲水性荧光标记物,具有良好的水溶性

陕西新研博美生物科技有限公司MISS.wu小编&#xff08;2023.7月26日&#xff09;为大家整理以下的内容&#xff1a; Atto488-NHS是一种新型亲水性荧光标记物&#xff0c;具有良好的水溶性。这种染料表现得很浓吸收、高荧光量子产率以及优异的热稳定性和光稳定性。因此&#xff…

亚马逊、速卖通,阿里国际等平台测评如何用自养号测评补单

在电商领域&#xff0c;补单是一种常见的推广方式。它能够优化商品销售、留下优质评论、打压竞品和赶走跟卖等&#xff0c;具有很多好处。然而&#xff0c;补单也存在安全性问题&#xff0c;有些卖家找人补单后店铺反而出了问题。因此&#xff0c;了解测评系统是非常重要的的。…

android9-android13 AMS演进初窥

目录 一&#xff1a;概览 WindowManagerService 基本介绍 ActivityManagerService 基本介绍 二&#xff1a;AMS及其关联的WMS中主要组件的类图和对像图 一&#xff1a;android 9中AMS/WMS的类图和对像图 二&#xff1a;android 10中AMS/WMS的类图和对像图 三&#xff1a…

关于应用在Google Play的元数据优化

应用标题中的关键词权重最大&#xff0c;其次是简短描述中的关键词&#xff0c;最后是长描述关键词&#xff0c;了解这些就能够很好的提高应用的可见度&#xff0c;下载量和整体成功率。 1&#xff0c;标题。 Google Play最多允许标题容纳30个字符&#xff0c;关键词的频率和密…

盘点!项目管理软件排行榜前十名

如今企业规模不断扩大&#xff0c;业务逐渐复杂化&#xff0c;项目管理已经成为现代企业管理中不可或缺的一环。作为协调管理者、团队成员和客户之间交流的工具&#xff0c;项目管理软件不仅可以提高工作效率&#xff0c;还可以提高项目成功的几率&#xff0c;对于企业具有重要…

Unity进阶--对象池数据场景管理器笔记

文章目录 泛型单例类泛型单例类&#xff08;不带组件版&#xff09;对象池管理器数据管理器场景管理器 泛型单例类 using System.Collections; using System.Collections.Generic;public abstract class ManagersSingle<T> where T : new() {private static T instance;…

DevExpress WPF Tree List组件,让数据可视化程度更高!(一)

DevExpress WPF Tree List组件是一个功能齐全、数据感知的TreeView-ListView混合体&#xff0c;可以把数据信息显示为REE、GRID或两者的组合&#xff0c;在数据绑定或非绑定模式下&#xff0c;具有完整的数据编辑支持。 DevExpress WPF 拥有120个控件和库&#xff0c;将帮助您…

验证码登录如何实现?

手机验证码登录 1、需求分析2、数据模型3、代码开发-交互过程4、代码开发-准备工作5、代码开发-修改LoginCheckFilter6、代码开发-接口开发7、前端代码介绍8、启动测试 1、需求分析 为了方便用户登录&#xff0c;移动端通常都会提供通过手机验证码登录的功能。 手机验证码登录…