【每日挠头算法题(9)】二叉树的直径|二叉树的层序遍历

news2024/9/21 5:30:35

文章目录

  • 一、二叉树的直径
    • 思路:二叉树的深度优先搜索
      • 具体代码如下:
  • 二、二叉树的层序遍历
    • 思路:借助队列实现
      • 具体代码如下:
  • 总结:


一、二叉树的直径

点我直达~

在这里插入图片描述

思路:二叉树的深度优先搜索

根据题目要求,求二叉树的直径,就是求二叉树的任意一个节点左右子树的最大深度,左右子树的最大深度的就是所求的路径。
看下图理解:

在这里插入图片描述

对于节点2来说,其左子树的最大深度为2,说明一定有一条大小为2的路径直通左子树的叶子节点,其右子树的最大深度为2,说明一定有一条大小为2的路径直通右子树的叶子节点,这样从以节点2为根节点的树的任意一个叶子节点一定有一条大小为4的路径到达另一个叶子节点。
所以我们需要做的就是找到任意一个节点的左右子树的最大深度。

  • 按照深度优先搜索的算法,我们首先持续遍历左子节点。如果节点为空,返回0

  • 将左右子树都遍历后,比较左右子树的高度,再返回大的高度+1就是当前节点的高度。

  • 注意:在这个过程,我们需要用一个全局变量max来更新每一次遍历某一个节点之后他的最长路径,也就是该节点的左右子树的高度之和。

具体代码如下:

class Solution {
public:
    int MAX; //记录每一次遍历一个节点的左右子树后的最长路径
    int depth(TreeNode* root)
    {
        if(root == nullptr)
            return 0;

        int l = depth(root->left);//递归左子树的最大深度
        int r = depth(root->right);//递归右子树的最大深度

        if(l+r > MAX)
            MAX = l+r;
        
        // 求出左右子树最大深度+1,就是到自己的深度
        return max(l,r) +1 ;
    }
    int diameterOfBinaryTree(TreeNode* root) 
    {
        MAX = 0;
        depth(root);
        return MAX ;
    }
};

时间复杂度O(n),空间复杂度O(n):最坏情况下为链式结构;最好情况下为平衡二叉树:O(logN);

二、二叉树的层序遍历

点我直达~

在这里插入图片描述

思路:借助队列实现

  • 二叉树的层序遍历,实际上就是广度优先搜索,从根往下从左到右逐一遍历每一层的节点。

  • 所以我们需要借助一个队列q1,如果该根节点不为空,将该节点入队

  • 然后计算队列中的元素数量,即为这一层的节点个数

  • 先取出该队列的队头元素,然后将该节点的val值存入到顺序表v1中,如果该节点的左右子节点均不为空,则带动该节点的左右子节点入队,然后再将该节点出队,最后重新计算该队列的元素大小。

  • 注意:每遍历完一层,就需要将v1加入到专门存储顺序表的顺序表v之中。

  • 不断重复上述过程,直到该树遍历完为止。

具体代码如下:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) 
    {
        vector<vector<int>> v;
        queue <TreeNode*> q1;
        //入队
        if(!root)
            return v;
        q1.push(root);
        while(!q1.empty())
        {
            //存进顺序表前先计算当前队列有多少个元素。
            int size = q1.size();
            vector <int> v1;
            //存入顺序表
            while(size--)
            {
                TreeNode* root = q1.front();

                v1.push_back(root->val);
                
                if(root->left)
                    q1.push(root->left);

                if(root->right)
                    q1.push(root->right);

                q1.pop();
            }
            //然后将v1存入v中并刷新
            v.push_back(v1);
        }

        return v;
    }
};

时间复杂度O(n),遍历完每一个节点;空间复杂度O(n),当二叉树退化到链式结构时,深度为n,系统维护的辅助栈就为n的大小;最好情况为平衡二叉树时,高度logN,空间复杂度O(logN)

总结:

通过写这道二叉树的直径,越发觉得递归是一个比较神奇且难以理解的东西,还有这个最长路径,我是看了不下5次的答案才看懂最长路径为什么等于一个节点的左右子树的深度和。

二叉树的层序遍历,需要借助队列实现,这个还是比较简单的,相对于官方标记层序遍历是中等题,个人更认为二叉树的直径这道题是中等题。

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

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

相关文章

【计网】第三章 数据链路层

文章目录 数据链路层一、使用点对点信道的数据链路层1.1 数据链路和帧1.2 三个基本问题封装成帧透明传输差错控制 二、点对点协议 PPP2.1 PPP 协议的特点2.2 PPP 协议的帧格式2.3 PPP 协议的工作状态 三、使用广播信道的数据链路层3.1 局域网的数据链路层3.2 CSMA/CD 协议3.3 使…

安规测试简介(二)-常见安规认证测试之CE认证

CE认证&#xff1a; CE是法语的缩写&#xff0c;英文意思为 “European Conformity” 即”欧洲共同体”, 事实上&#xff0c;CE还是欧共体许多国家语种中的"欧共体"这一词组的缩写&#xff0c;原来用英语词组EUROPEAN COMMUNITY 缩写为EC&#xff0c;后因欧共体在法文…

python---字典(1)

字典的创建 字典: 是一种存储键值对的 键值对: 键(key) 值(value) 根据key可以快速的找到value (key和value有一定的映射关系) 在python字典中可以包含很多键值对,但是键是唯一的. 创建一个空的字典 创建字典的同时,设置初始值 推荐写法是如下的字典的初始化: 字典查找ke…

unittest教程__assert断言(4)

测试用例是否测试通过是通过将预期结果与实际结果做比较来判定的&#xff0c;那代码中怎么来判定用例是否通过呢&#xff1f;在python中这种判定的方法就叫做断言&#xff0c;断言可以使用python的assert方法&#xff0c;也可以使用unittest框架提供的一系列断言方法。 unitte…

强化历程2-Vue+axios+ajax面试系列(2023.6.17)

因为主要是后端&#xff0c;在此训练都是非常基础的题目,后续会持续更新… 文章目录 强化历程2-Vueaxiosajax面试系列(2023.6.18第一次更新)题目汇总1 Vue常用指令2 v-show和v-if区别3 讲一讲MVVM4 vue特点?5 vue组件之间的传值6 vue整合其他框架7 vue生命周期8 vue中实现路由…

通过共享内存进行通信(嵌入式学习)

通过共享内存进行通信 概念特点函数示例代码 概念 在Linux中&#xff0c;共享内存是一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;允许多个进程共享同一块内存区域。这种通信方式可以提供高效的数据传输&#xff0c;特别适用于需要频繁交换数据的场景。 IO间进…

【运动控制】安装固高运动控制卡驱动程序

【运动控制】安装固高运动控制卡驱动程序 1、背景2、卸载PCI设备3、安装驱动4、安装验证 1、背景 运动控制卡是用来做什么的&#xff1f;顾名思义&#xff0c;用来控制电机转动的。 本博客简单介绍固高科技(深圳)有限公司的运动控制卡的驱动安装。 在购买了固高控制卡后&…

网络层(3)6/12

1.网络层 网络层最大的特点就是提供路由&#xff0c;路由就是分组从源到目的地址时&#xff0c;绝定的端到端的路径 路由&#xff1a;路由是网络层最主要的工作任务 网关&#xff1a;一个网络域到另一个网络域的关卡&#xff0c;主要用于不同网段之间的通讯 路由的获取方式&…

OpenGL之鼠标拾取和模型控制

文章目录 鼠标拾取转化步骤步骤 0&#xff1a;2D 视口坐标步骤 1&#xff1a;3D 规范化设备坐标步骤2&#xff1a;4d 均匀剪辑坐标步骤3&#xff1a;4D 眼&#xff08;相机&#xff09;坐标步骤4&#xff1a;4d 世界坐标 源码 模型控制源码 鼠标拾取 转化步骤 使用鼠标单击或“…

PMP考试成绩查询流程

具体查询方法如下 当你在PMI的注册邮箱收到一封PMI发来的&#xff0c;标题为&#xff1a; 祝贺您获得PMP认证的邮件时&#xff0c;表明你通过了PMP考试。 若没收到邮件&#xff0c;可通过以下方式进行成绩查询&#xff1a; 1、打开PMI官网&#xff1a;www.pmi.org&#xff0…

给初级测试工程师的一些避坑建议

我遇到的大多数开发人员都不怎么热衷于测试。有些会去做测试&#xff0c;但大多数都不测试&#xff0c;不愿意测试&#xff0c;或者勉而为之。我喜欢测试&#xff0c;并且比起编写新的代码&#xff0c;愉快地花更多的时间在测试中。我认为&#xff0c;正是因为专注于测试&#…

【文生图系列】基础篇-变分推理(数学推导)

文章目录 KL散度前向 vs 反向 KL前向KL反向KL可视化 问题描述变分推理ELBO: Evidence Lower Bound参考 此篇博文主要介绍什么是变分推理(Variational Inference , VI)&#xff0c;以及它的数学推导公式。变分推理&#xff0c;是机器学习中一种流行的方式&#xff0c;使用优化的…

LLMs模型速览(GPTs、LaMDA、GLM/ChatGLM、PaLM/Flan-PaLM、BLOOM、LLaMA、Alpaca)

文章目录 一、 GPT系列1.1 GPTs&#xff08;OpenAI&#xff0c;2018——2020&#xff09;1.2 InstructGPT&#xff08;2022-3&#xff09;1.2.1 算法1.2.2 损失函数 1.3 ChatGPT&#xff08;2022.11.30&#xff09;1.4 ChatGPT plugin1.5 GPT-4&#xff08;2023.3.14&#xff0…

【kubernetes】集群架构介绍与基础环境准备

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机准备开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

Something of Information Security Management

1、信息安全管理基本概念&#xff0c;管理的目标、对象的基本内容、必要性。 信息安全管理是指通过制定和实施一系列的管理措施&#xff0c;保护信息系统中的信息资源免受各种威胁和风险的侵害&#xff0c;确保信息系统的安全、可靠、高效运行。信息安全管理的基本概念包括&…

java 文本处理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目文本分词算法

一、源码特点 java 文本处理系统是一套完善的java web信息管理系统&#xff0c;利用java 对文本语句进行分词&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,Myeclipse…

paddlespeech asr语音转录文字;sherpa 实时语音转录

1、paddlespeech asr语音转录文字 参考&#xff1a; https://github.com/PaddlePaddle/PaddleSpeech 安装后运行可能会numpy相关报错&#xff1b;可能是python和numpy版本高的问题&#xff0c;我这里最终解决是python 3.10 numpy 1.22.0&#xff1b; pip install paddlepadd…

蔚来测试总监,让我们用这份《测试用例规范》,再也没加班过

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持&#xff0c;作为测试职场摸爬打滚的老人&…

【计网】第二章 物理层

文章目录 物理层一、物理层的基本概念二、数据通信的基础知识2.1 数据通信系统的模型2.2 有关信道的基本概念2.3 信道的极限容量2.3.1 奈奎斯特定理2.3.1 香农定理2.3.2 信噪比 三、物理层下面的传输媒体3.1 导引型传输媒体3.2 非导引型传输媒体 四、信道复用技术4.1 频分复用 …

基于RGBD和惯性输入的实时室内场景重建

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 论文标题&#xff1a;《REAL-TIME INDOOR SCENE RECONSTRUCTION WITH RGBD AND INERTIA INPUT》 论文链接&#xff1a;https://arxiv.org/pdf/2008.00490.pdf 代码链接&#xff1a;https://github.com/CWa…