Leetcode:513. 找树左下角的值(C++)

news2024/11/16 22:38:30

目录

问题描述:

实现代码与解析:

递归:

原理思路:

层序遍历:

原理思路:


问题描述:

        给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

示例 1:

输入: root = [2,1,3]
输出: 1

示例 2:

输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7

实现代码与解析:

递归:

class Solution {
public:  
    int maxDepth=INT_MIN;//记录最大深度,初始化为最小值
    int result;//记录结果
    void traversal(TreeNode* root,int depth)
    {
        //判断为叶子结点
        if(root->left==NULL&&root->right==NULL)
        {
            if(depth>maxDepth)
            {
                result=root->val;//更新结果
                maxDepth=depth;//更新最大深度
            }
        }
        if(root->left)
        {
            traversal(root->left,depth+1);
        }
        if(root->right)
        {
            traversal(root->right,depth+1);
        }
    }
    int findBottomLeftValue(TreeNode* root) 
    {  
        int depth=0;
        traversal(root,depth);
        return result;
        
    }
};

原理思路:

        此题找树的左下角的值,不是一直向左遍历就行,这里我们要找的是树的最后一层最左侧的值,不一定是左孩子,也可以是右孩子,只要在最左侧就可以,如下图例子:

                                                                                                                                                                                                                                                                                                                       

        所以我们就确定了我们要找的是最大深度的第一个结点,所以我们定义一个maxDepth来记录最大深度,一个depth来记录当前深度,当遇到叶子结点时,我们就开始判断和更新最大深度,同时记录符合条件的结果:

//判断为叶子结点
if(root->left==NULL&&root->right==NULL)
{
    if(depth>maxDepth)
    {
        result=root->val;//更新结果
        maxDepth=depth;//更新最大深度
    }
}

        然后后面的代码就是正常遍历即可,记得在进入下一层时判断一下左子树或右子树是否为空,因为我们没写判断结点为空而返回的代码,所以我们就在移动时,判断一下,不要走到空结点就可以,两种写法都是可以的。

if(root->left)
{
    traversal(root->left,depth+1);
}
if(root->right)
{
    traversal(root->right,depth+1);
}

或者这样:

//最前面加上这行代码
if(root==NULL) return;
.............//中间省略
.............
.............       
traversal(root->left,depth+1);
traversal(root->right,depth+1);

其实这里我们省略了回溯过程:

if (root->left) 
{  
    depth++; 
    traversal(root->left, depth);
    depth--;//回溯
if (root->right) 
{ 
    depth++; 
    traversal(root->right, depth);
    depth--; //回溯
}

        这样写可能更好理解一些,想明白了后可以写简洁的。这题用层序来写是更简单一点的,下面给出。

层序遍历:

class Solution {
public:
    //层序遍历
    int findBottomLeftValue(TreeNode* root) 
    {
        if(root==NULL) return 0;
        queue<TreeNode*> que;
        que.push(root);
        int result=root->val;//记录结果
        while(!que.empty())
        {
            int size=que.size();
            int flag=0;//判断是否已经记录了每一层第一个结点
            for(int i=0;i<size;i++)
            {                
                TreeNode* temp=que.front();           
                que.pop();            
                if(temp->left)
                {
                    que.push(temp->left);
                    if(flag==0)
                    {
                        result=temp->left->val; 
                        flag=1;//记录完后,将falg改为1,
                    }
                }           
                if(temp->right)
                {
                    que.push(temp->right);
                    if(flag==0)
                    {
                        result=temp->right->val;
                        flag=1;//与上同理
                    }
                }
            }
        }                      
        return result;
    }
};

原理思路:

        看到这个题目,首先容易想到的就是层序遍历。记录每层从左到右的第一个结点,为了只记录每层第一个结点避免重复记录,就用falg判断一下就可以,若已经取到了此层的第一个结点,就改变flag的值即可。

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

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

相关文章

kaggle平台学习复习笔记 | Data Visualization | Seaborn

目录1.hello Seaborn2.Line Charts3.Bar Charts and Heatmaps4.Scatter PlotsDistributions5.Choosing Plot Types and Custom Styles1.hello Seaborn import pandas as pd pd.plotting.register_matplotlib_converters() import matplotlib.pyplot as plt %matplotlib inline…

阿里云服务器安装mysql数据库教程

阿里云服务器怎么安装mysql数据库&#xff1f;阿里云服务器ECS如何安装mysql数据库教程。主机教程网下面就来分享一下阿里云服务器安装mysql数据库教程。 第一步 1、登录个人的阿里云服务管理终端 2、点击进入远程连接&#xff0c;输入之前设置的远程登录密码&#xff08;如…

能够激发创作灵感的笔记软件,强大在哪里? #RoamResearch

今天的人类知识体系&#xff0c;已经汇聚成了一个浩瀚的信息与思想的海洋&#xff0c;信息量呈指数级增长&#xff0c;如果能够解决潜在的协作问题&#xff0c;这会给个体带来巨大的机会。怎么有效利用信息&#xff1f;如何搭建自己的知识体系&#xff1f;这些都是信息爆炸的时…

在ubuntu系统上用pyinstaller打包yolov5项目代码

目录0. 背景1. 创建虚拟环境2. pyinstaller打包2.1. 生成并修改spec文件2.2. 重新生成二进制文件3. 测试0. 背景 最近需要在ubuntu 18.04上将自己写的一些基于yolov5的项目代码打包成二进制文件&#xff0c;方便部署的同时也尽量减少暴露源码。 参考网上的很多教程&#xff0…

Node.JS(4)--模块、exports和module

文章目录模块核心模块文件模块基本数据类型引用数据类型exports和module.exports的关系模块 分为两大类 核心模块 由node引擎提供的模块 核心模块的标识就是模块的名字 var fsrequire("fs");文件模块 由用户自己创建的模块文件模块的标识就是文件的路径&#x…

一个专注推荐.Net开源项目的榜单

大家好&#xff0c;我是编程乐趣&#xff0c;从7月份开始推荐开源项目&#xff0c;已经推荐了接近100个开源项目了&#xff0c;其中绝大部分是有关.Net的开源项目&#xff0c;也受到大家非常多人的喜欢。 由于公众号不方便查询&#xff0c;很多人又想了解更多的开源项目&#…

C++【多线程】

文章目录一、什么是线程二、创建线程一、什么是线程 线程在进程内部执行&#xff0c;是OS调度的基本单位。 在堆区上存在下面一种数据结构 struct vm_area_struct{ //用来记录这块空间的起始和终止。unsigned long vm_start;unsigned long vm_end;//其实这是一个双向链表中的结…

判断环形链表是否有环??返回环形链表的入口点!!

上次笔者写了一篇大概有7个题的链表相关的题目解析&#xff0c;感觉还不错&#xff0c;感兴趣的各位老铁&#xff0c;可以点一下链接进行欣赏&#xff1a;做几个与链表相关的题吧&#xff01;https://blog.csdn.net/weixin_64308540/article/details/128550685?spm1001.2014.3…

CPT205-Computer Graphics(2)

文章目录7. Hierarchical Modelling7.1 Local and world co-ordinate frames of reference7.1.1 Relative motion7.2 Linear modelling7.3 Hierarchical modelling7.3.1 Hierarchical transformations8. Lighting and Materials8.1 Lighting sources8.1.1 Point light8.1.2 Dir…

如何将revit的内建模型导出使用?项目族管理功能介绍

Revit中内建模型建模是我们常用的功能&#xff0c;每次建模完成后都可以在另一个项目中使用&#xff0c;但是前提是需要导出后再载入才能在另一个项目中使用。今天就教教大家如何将Revit的内建模型单独导出&#xff0c;方便大家下次使用在其它项目。 如何将revit的内建模型单独…

计算机组成原理_总线的性能指标

计算机组成原理总目录总线的性能指标 一、总线周期和时钟周期 总线周期 总线周期通常指的是CPU完成一次访问内存或I/O端口操作所需要的时间 其中包括申请阶段、寻址阶段、传输阶段和结束阶段时钟周期 时钟周期是处理操作最基本的单位&#xff0c;在一个时钟周期内&#xff0c;…

【历史上的今天】1 月 9 日:iPhone 问世;iTunes 发布;激光打印机的发明者出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 1 月 9 日&#xff0c;在 1978 年的这段时间&#xff0c;我国恢复了研究生制度&#xff0c;这一年&#xff0c;共录取了 10500 多名研究生。研究生教育的中断和…

哈希的应用 —— 布隆过滤器

目录 一、布隆过滤器的提出 二、布隆过滤器的介绍 1. 基本概念 2. 布隆过滤器的特点 3. 哈希函数和布隆过滤器的长度对误判的影响 三、布隆过滤器的实现 1. 布隆过滤器的插入 &#xff08;Set接口&#xff09; 2. 布隆过滤器的查找&#xff08;Test接口&#xff09; …

javascript原型之保姆级讲解

目录前言一&#xff0c;面向对象编程1.1 面向过程与面向对象1.2 JS创建类和对象1.3 类的继承1.4 Super关键词1.5 几个注意点二&#xff0c;构造函数原型2.1 创建对象的三种方法2.2 静态成员和实例成员2.3 构造函数的弊端2.4 函数的共享-原型prototype2.5 对象原型___proto__2.6…

用Python制作你的专属音乐播放器(此刻浪漫只属于你哦*´▽`*)

文章目录前言一、项目介绍二、环境配置三、代码实战前言 昨天是博主的一位朋友生日&#xff0c;除了送上大大的红包&#xff0c;知道他喜欢听音乐&#xff0c;特意用代码给他写了一个 专属音乐播放器&#xff0c;今天把这个代码也开源送给所有粉丝哦。 一、项目介绍 我们常用…

Vue--》实现动画与过渡效果

目录 动画效果 过渡效果 第三方动画库 Vue封装的过渡与动画作用是在插入、更新或移除DOM元素时&#xff0c;在合适的时候给元素添加类名。 动画效果 操作css的trasition或animation&#xff0c;vue会给目标元素添加/移除特定的class&#xff0c;过渡的相关类名是&#xff1…

Spring项目中用了这种解耦模式,经理对我刮目相看

前言 不知道大家在项目中有没有遇到过这样的场景&#xff0c;根据传入的类型&#xff0c;调用接口不同的实现类或者说服务&#xff0c;比如根据文件的类型使用 CSV解析器或者JSON解析器&#xff0c;在调用的客户端一般都是用if else去做判断&#xff0c;比如类型等于JSON&…

【Spring6源码・IOC】Bean的实例化

上一节我们讲到《【Spring6源码・IOC】BeanDefinition的加载》&#xff0c;这一节我们来讲解一下Bean的实例化。 根据xml或注解加载完Bean的信息后&#xff0c;最终会通过反射来创建bean的对象。 invokeBeanFactoryPostProcessors()主要是加载BeanDefinition。 finishBeanFa…

MAC(m1)-VMWare Fusion安装CentOS7.9(续)

下载了CentOS8&#xff0c;优先安装CentOS8 默认的配置有点小, 可以根据自己需求进行自定义设置&#xff1a; 点击存储&#xff0c;会出现&#xff1a; 咱们是中国人&#xff0c;优先选择中文&#xff1a; 点击网络和主机名&#xff0c;配置网络&#xff1a; 打开网卡开关&…

找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标

找出给定数组中和是给定目标整数的两个整数&#xff0c;输出找到的两个整数下标。 (本文获得CSDN质量评分【x】)【学习的细节是欢悦的历程】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅…