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

news2024/12/28 4:05:17

文章目录

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

所有的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;    // 根节点深度定义为1
        while (!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;    // 根节点深度定义为1
        while (!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;    // 根节点深度定义为1
        while (!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;    // 根节点深度定义为1
        while (!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.coloradmin.cn/o/787854.html

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

相关文章

通付盾获苏州市工业互联网产业联盟“工业互联网看苏州”先锋企业

近日&#xff0c;苏州市工业互联网产业联盟公布2022年度苏州市工业互联网产业联盟系列评选获评名单&#xff0c;通付盾荣获“工业互联网看苏州”先锋企业。 为加快推动工业互联网在数字赋能产业创新集群融合发展中发挥更显著作用&#xff0c;进一步完善苏州市工业互联网产业生态…

Docker Compose 容器编排 + Docker--harbor私有仓库部署与管理

目录 一、Docker Compose简介 1、Docker Compose 的YAML 文件格式及编写注意事项 2、Docker compose 使用的三个步骤 3、 Docker Compose配置常用字段 4、 Docker Compose 常用命令 5、 Docker Compose 文件结构 二&#xff1a; Docker Compose 安装 1、Docker Compose…

【C#】并行编程实战:基于任务的异步编程基础(下)

第八章介绍了 C# 中可用异步编程的实践和解决方案&#xff0c;还讨论了何时适合使用异步编程等。本章主要介绍 async 和 await 关键字。 其实在之前的学习中&#xff0c;大家都已经了解过这两个关键字了&#xff0c;用得非常多。其实我觉得没有必要再赘述了&#xff0c;不过这里…

Git简介与工作原理:了解Git的基本概念、版本控制系统和分布式版本控制的工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Centos安装postgresql数据库以及postgis扩展的安装

这几天项目上的数据库迁移差点没把我弄死 &#xff0c;因为项目上的使用的是postgis来处理地理数据 &#xff0c;而开发环境的数据库以及postgis扩展并不是我安装的。所以在迁移的时候造成了不小的麻烦。记录一下迁移过程中遇到的。下面以Centos操作系统为例 文章目录 卸载post…

微信小程序——实现手机振动效果

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

解决行业反复“造轮子”现象,全新地平线RDK系列机器人开发者套件上线

7月25日&#xff0c;“地平线2023机器人开发者创享日”在深圳举办&#xff0c;地平线RDK系列机器人开发者套件正式上线&#xff0c;机器人操作系统TogetheROS.Bot™2.0版发布&#xff0c;应用中心NodeHub首发亮相&#xff0c;地平线开发者社区改版上线。 地平线2023机器人开发者…

go性能分析工具之trace

参考文章&#xff1a; https://eddycjy.gitbook.io/golang/di-9-ke-gong-ju/go-tool-trace https://mp.weixin.qq.com/s__bizMzUxMDQxMDMyNg&mid2247484297&idx1&sn7a01fa4f454189fc3ccdb32a6e0d6897&scene21#wechat_redirect 你有没有考虑过&#xff0c;你的g…

HTTP1、 HTTP2、HTTP3 区别

HTTP1、 HTTP2、HTTP3 区别 HTTP1HTTP/1.0和HTTP/1.1的区别HTTP1的缺陷 HTTP2SPDY协议HTTP/2 新特性&#xff08;即HTTP/2.0和HTTP/1.x的区别&#xff09;HTTP/2 的缺点 HTTP3QUIC协议HTTP/3 新特性&#xff08;HTTP/3与HTTP/2、HTTP/1的区别&#xff09;基于QUIC的0RTT是如何实…

【Linux后端服务器开发】HTTP协议

目录 一、HTTP协议概述 二、HTTP应用层服务器实现 Util.hpp Protocal.hpp Http_Server.hpp http_server.cc indext.html 一、HTTP协议概述 请求和响应怎么保证应用层完整读取完毕了&#xff1f; 读取完整的一行&#xff08;识别行分隔符&#xff09;&#xff0c;while&…

MobPush Android SDK 厂商推送限制

概述 厂商推送限制 每个厂商通道都有对应的厂商配额和 QPS 限制&#xff0c;当请求超过限制且已配置厂商回执时&#xff0c;MobPush会采取以下措施&#xff1a; 当开发者推送请求超过厂商配额时&#xff0c;MobPush将通过自有通道进行消息下发。当开发者推送请求超过厂商 QP…

elementui el-table 封装表格

ps: 1.3版本 案例&#xff1a; 完整代码&#xff1a; 可直接复制粘贴&#xff0c;但一定要全看完&#xff01; v-slot"scopeRows" 是vue3的写法&#xff1b; vue2是 slot-scope"scope" <template><!-- 简单表格、多层表头、页码、没有合并列行…

2023年度盘点:网络电视盒子哪个好?目前性能最好的电视盒子

挑选电视盒子时配置性能是最重要的&#xff0c;芯片、运存、存储全部会影响到我们的观影体验&#xff0c;想播放流畅、响应速度快&#xff0c;要在预算范围内选择配置最高的产品&#xff0c;那么哪些电视盒子称得上是目前性能最好的电视盒子呢&#xff1f;不懂网络电视盒子哪个…

自定义view - 玩转字体变色

自定义View步骤&#xff1a; 1>&#xff1a;values__attrs.xml&#xff0c;定义自定义属性&#xff1b; 2>&#xff1a;在第三个构造方法中获取自定义属性&#xff1b; 3>&#xff1a;onMeasure【不是必须的】&#xff1b; 4>&#xff1a;onDraw&#xff1a;绘制代…

【Java中的Thread线程的简单方法介绍和使用详细分析】

文章目录 前言一、run() 和 start() 方法二、sleep() 方法三、join() 方法总结 前言 提示&#xff1a;若对Thread没有基本的了解&#xff0c;可以先阅读以下文章&#xff0c;同时部分的方法已经在如下两篇文章中介绍过了&#xff0c;本文不再重复介绍&#xff01;&#xff01;…

海量遥感数据处理与云计算技术教程

详情点击链接&#xff1a;海量遥感数据处理与GEE云计算技术 一&#xff0c;GEE及开发平台 1.GEE平台及典型应用&#xff1b; 2.GEE JavaScript开发环境及常用数据资源&#xff1b; 3.JavaScript基础&#xff0c;包括变量&#xff0c;运算符&#xff0c;数组&#xff0c;判断及…

【数据结构和算法15】二叉树的实现

二叉树是这么一种树状结构&#xff1a;每个节点最多有两个孩子&#xff0c;左孩子和右孩子 重要的二叉树结构 完全二叉树&#xff08;complete binary tree&#xff09;是一种二叉树结构&#xff0c;除最后一层以外&#xff0c;每一层都必须填满&#xff0c;填充时要遵从先左后…

程序员千万别碰这3种副业!!!

最近&#xff0c;“消费降级”这个词频频被大家提及&#xff0c;某瓣上&#xff0c;“今天消费降级了吗”小组的常驻人口有36万&#xff0c;某书上&#xff0c;跟消费降级有关的笔记近7万条...... 不少网友晒出了自己消费降级后的生活&#xff1a;由从前每天一杯的星巴克变成了…

ROS noetic,ROS melodic 安装 MoveIt 并运行

ROS noetic&#xff0c;ROS melodic 安装 MoveIt 并运行 前言更新功能包版本下载依赖文件创建工作区和软件源下载源代码安装编译器缓存&#xff08;可选环节&#xff09;编译Moveit&#xff01;安装Moveit&#xff01;检测是否安装成功 前言 在安装过程中我也碰壁过很多次&…

[算法通关村] 1.3 链表的删除

上一节我们谈到了链表的头插、尾插、中间插入的方法&#xff0c;忘记的小伙伴可以复习一下&#xff1a; [算法通关村] 1.2 链表的插入 接下来&#xff0c;完成链表的删除工作&#xff0c;我们在上一节的学习中&#xff0c;分别在链表的开头、中间和结尾插入了节点&#xff0c;…