90、【树与二叉树】leetcode ——104. 二叉树的最大深度:层次遍历+DFS+子问题分解(C++版本)

news2024/11/17 1:52:48

解题思路

在这里插入图片描述
原题链接:104. 二叉树的最大深度

解题思路

1、迭代法:层次遍历BFS

/**
 * 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)       return 0;
        int res = 0;
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()) {
            int n = que.size();
            res++;
            while(n--) {
                TreeNode* node = que.front();
                que.pop();                
                if(node->left)      que.push(node->left);
                if(node->right)     que.push(node->right);
            }
        }
        return res;
    }
};

2、递归:先序遍历DFS

设置一个变量depth记录深度变化,一个变量res记录全局中最大深度。每次是先判定中间节点,再分别处理左、右子树。当中间结点为叶子结点时,判定此时是否为最大高度。

/**
 * 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 res = 0;    
    void traversal(TreeNode* node, int &depth) {
        if(node == NULL)       return ;
        // 该层结点不为空,深度加一
        depth++;
        // 当遍历到叶结点时,计算最大高度
        if(node->left == NULL && node->right == NULL)   // 中
            res = max(res, depth);
        traversal(node->left, depth);                   // 左
        traversal(node->right, depth);                  // 右
        // 该层结点已遍历完,返回上一层,去剩余情况遍历
        depth--;
    }

    int maxDepth(TreeNode* root) {
        int depth = 0;
        traversal(root, depth);
        return res;
    }
};

3、递归:后序遍历DFS(分解问题思路)

想要求出最大深度,也就是得到左子树最大深度和右子树最大深度。将该问题看作,自底向上,每次获取子树的最大深度,即可得到整个树的最大深度。

使用栈的特点,第一次执行时,会将初始函数压入栈中,最终结果的答案会在最后返回。之后子函数会不断压栈,计算最大深度,并把计算结果返回给上一次层的函数。

这个实现,实际上也就是二叉树的后序遍历,以左右中的顺序处理,每次处理完中后,即将该层的结果返回给上一层,上一层继续处理。

注意:后序遍历实际上求得是最大高度
image.png

/**
 * 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 == NULL)    return 0;
        int maxLeft = maxDepth(root->left);     // 左
        int maxRight = maxDepth(root->right);   // 右
        return max(maxLeft, maxRight) + 1;      // 中,处理完后,交给上一层处理
    }
};

参考文章:104.二叉树的最大深度

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

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

相关文章

Blender 物理属性 (二)布料和碰撞

文章目录添加与去除布料查看布料效果布料的预设属性(模拟不同的布料效果)布料与其他物体碰撞布料的自交叉问题布料钉固制作一个窗帘添加与去除布料 1 添加&#xff1a;物体模式选中一个物体&#xff0c;属性栏/物理属性&#xff08;蓝色圆圈&#xff09;&#xff0c;选择布料 …

程序员转项目经理,需要拒绝的3大习惯。

程序员转项目经理并不容易&#xff0c;需要我们转变思路&#xff0c;并拒绝我们日常3大习惯。 1、拒绝单打独干&#xff0c;转而关注与干系人的沟通协调。 做为技术人员&#xff0c;在确定自我任务后&#xff0c;独自敲代码就好&#xff0c;具有较强的单干性质。而作为项目经理…

前端项目代码统一规范-从eslint、stylelint、husky、lint-staged、commitlint和配合vscode插件一一道来

目前在多人项目开发时发现很多代码不规范的地方&#xff0c;因为每个项目都是多人维护&#xff0c;再加上各种历史代码的不同风格&#xff0c;这些情况很容易就造成了代码规范落地难&#xff0c;项目中出现大量低质量代码&#xff0c;代码格式难统一。所以采用 eslinthuskystyl…

【Vue】移动端项目流程

移动端项目 O 项目技术栈说明 脚手架&#xff1a; Vite 3 还有 vue-cli - 底层 webpack 脚本&#xff1a;typescript路由&#xff1a;vue-router4状态管理器&#xff1a; vuex4 还有 pinia 组件库&#xff1a;vant3.6.3组件API&#xff1a;选项式API 一、Vite 脚手架的使用 …

PostgreSQL复习记录(一):Win10成功安装postgresql14.6的过程记录

到官网下载页面选择合适的版本进行下载&#xff0c;我这里选择Windows版本&#xff0c;跳转到Download PostgreSQL后选择PostgreSQL Version 14.1 Windows x86-64的版本。 1&#xff0c;启动安装程序&#xff1a; 如果只是练习使用&#xff0c;安装时这里可以取消勾选Stack Bu…

戴尔电脑开机屏幕花屏无法启动解决方法

戴尔电脑开机屏幕花屏无法启动解决方法。有用户使用的戴尔电脑开机的时候出现了一些问题&#xff0c;电脑屏幕变成了满屏的马赛克花屏&#xff0c;不能正常启动到桌面页面上了。那么这个问题要如何去做出解决&#xff0c;一起看看操作的方法吧。 准备工作&#xff1a; 1、U盘一…

初步认识 Babel

Babel 官网&#xff1a;https://www.babeljs.cn/docs/1.AST 抽象语法树AST 抽象语法树&#xff0c;是 Babel 的核心在 JavaScript 的世界中&#xff0c;你可以认为抽象语法树&#xff08;AST&#xff09;是最底层下面会通过拆解一个普通函数&#xff0c;解释下什么是 AST 抽象语…

node服务从http升级到https(阿里云免费ssl)

升级原因1.各大搜索引擎中&#xff0c;https的网页的权重比一般的http的网页权重要高。2.从用户体验的角度&#xff0c;一个老是被浏览器提醒该网页不可信的网页&#xff0c;总不会让用户感到安心所以将网站从http升级为https是很有必要的用户配置首先介绍一下这次升级的网站使…

拓扑排序 (算法思想+图解+模板+练习题)

拓扑排序 有向无环图一定是拓扑序列,有向有环图一定不是拓扑序列。 无向图没有拓扑序列。 首先我们先来解释一下什么是有向无环图&#xff1a; 有向就是我们两个结点之间的边是有方向的&#xff0c;无环的意思就是整个序列中没有几个结点通过边形成一个圆环。 下图就是一个…

数据分析:通俗易懂假设检验

导读 大多数关于假设检验的教程都是从先验分布假设开始&#xff0c;列出一些定义和公式&#xff0c;然后直接应用它们来解决问题。然而&#xff0c;在本教程[1]中&#xff0c;我们将从第一原则中学习。这将是一个示例驱动的教程&#xff0c;我们从一个基本示例开始&#xff0c;…

Web(五、六)

JavascriptDOM* 功能&#xff1a;控制html文档的内容* 获取页面标签(元素)对象&#xff1a;Element* document.getElementById("id值"):通过元素的id获取元素对象* 操作Element对象&#xff1a;1. 修改属性值&#xff1a;明确获取的对象是哪一个&#xff1f;查看API文…

BI工具将数据分析拉下神坛

以前&#xff0c;数据分析是一件比较有门槛的事&#xff0c;它不仅要求数据分析师具备一定的数据分析思维和方法经验&#xff0c;还要求数据分析师们熟练使用各种复杂的数据分析工具&#xff0c;要求他们掌握Python、R、SQL等。但随着BI工具的发展&#xff0c;多维自助分析逐渐…

组织机构管理不得不了解的 RBAC 权限模型|身份云研究院

由于信息安全越来越被重视&#xff0c;企业的身份管理已经成为市场焦点&#xff0c;对于实施企业级安全策略和身份管理的需求随之迅速上升。而作为权限访问控制策略的 RBAC&#xff08;基于角色的访问控制&#xff09;模型也已被广泛使用到组织机构管理中&#xff0c;本文将带领…

LeetCode刷题模版:81 - 90

目录 简介81. 搜索旋转排序数组 II82. 删除排序链表中的重复元素 II83. 删除排序链表中的重复元素84. 柱状图中最大的矩形85. 最大矩形86. 分隔链表87. 扰乱字符串【未理解】88. 合并两个有序数组89. 格雷编码90. 子集 II结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有…

vue组件中插槽slot的使用

目录 插槽 1、组件的三大核心&#xff1a;属性&#xff08;data、props&#xff09;、事件、插槽 2、插槽&#xff08;slot&#xff09;&#xff1a;将子组件和父组件进行组合&#xff0c;可以弥补视图的不足。使组件具有更好的扩展性 组件的封装方式&#xff1a;抽取共性、…

CMMI五大成熟度定义及过程管理类详解

一、成熟度级别CMMI组织的成熟度级别提供了描述其绩效特征的方式。经验表明&#xff0c;当组织每次过程改进工作所专注的过程域在数量上易管理时&#xff0c;组织能够做到最好&#xff1b;那些领域随着组织的改进&#xff0c;也需要不断成熟。成熟度级别是组织级过程改进的预定…

ADI边缘 AI MCU,助力从万物互联到万物智联

物联网被视为继计算机、互联网之后世界信息产业发展的第三次浪潮。据 IoT Analytics 在 2022 年 5月发布的《物联网现状 2022 年春季版》报告显示&#xff0c;2021 年全球物联网连接数量增长 8%&#xff0c;达到 122 亿个活跃端点&#xff1b;到 2022 年&#xff0c;物联网市场…

【KANO】需求管理模型

1.什么是Kano模型 Kano模型就是一个可以帮助我们有效识别“真伪需求”、划分需求优先级的有效工具。Kano模型是东京理工大学教授狩野纪昭&#xff08;Noriaki Kano&#xff09;发明的对用户需求分类和优先排序的有用工具&#xff0c;以分析用户需求对用户满意的影响为基础&…

【分享】原力计划的初衷 【探讨】新的一年,你对原力计划有哪些期待?

课前小差 哈喽&#xff0c;大家好&#xff0c;我是几何心凉&#xff0c;这是一份全新的专栏&#xff0c;唯一得倒CSDN王总的授权&#xff0c;来对于我们每周四的绿萝时间 ——【直达CSDN】直播内容进行总结概括&#xff0c;让大家能够省去看直播回放的时间也能够了解直播内容和…

JavaScript创建对象的方式

概述 JavaScript有多种创建对象的方式。 方式一&#xff1a;newfunction构造函数 function DogFactory(type, color) {this.type typethis.color color } // 方式一&#xff1a;new var dog new DogFactory(Dog, Black); console.log(dog) // new DogFactory(Dog, Black)…