二叉树——9.找树左下角的值

news2024/11/28 2:02:07

力扣题目链接

给定一个二叉树,在树的最后一行找到最左边的值。

示例:

输出:7

题干很简单,找到树的最后一行,在该行找到最左边的值,结合完整代码进行分析。

完整代码如下:

class Solution:
    def findBottomLeftValue(self, root: TreeNode) -> int:
        self.max_depth = float('-inf')
        self.result = None
        self.traversal(root, 0)
        return self.result
    
    def traversal(self, node, depth):
        if not node.left and not node.right:
            if depth > self.max_depth:
                self.max_depth = depth
                self.result = node.val
            return
        
        if node.left:
            depth += 1
            self.traversal(node.left, depth)
            depth -= 1
        if node.right:
            depth += 1
            self.traversal(node.right, depth)
            depth -= 1

首先初始化max_depth,用来记录当前访问到的最大深度。初始值设为负无穷大,保证第一次遇到叶子节点时会更新深度。初始化一个属性result,用来存储最底层最左边节点的值。调用辅助方法traversal,开始递归遍历二叉树,初始深度设为0。遍历完成后,返回最底层最左边节点的值。

接着开始定义辅助函数traversal。

        if not node.left and not node.right:
            if depth > self.max_depth:
                self.max_depth = depth
                self.result = node.val
            return

检查当前节点是否是叶子节点(即没有左子节点和右子节点)。如果是叶子节点则进入下一层if,如果当前节点的深度大于已记录的最大深度,更新最大深度和结果值。更新max_depth为当前节点的深度,更新result为当前节点的值。

        if node.left:
            depth += 1
            self.traversal(node.left, depth)
            depth -= 1
        if node.right:
            depth += 1
            self.traversal(node.right, depth)
            depth -= 1

如果当前节点有左子节点,递归遍历左子树。depth += 1是一个计数操作,将当前节点的深度增加1,这表示我们正在进入二叉树的下一层。在递归调用之前增加深度是为了确保递归调用时能够正确地反映该节点在二叉树中的实际深度。

接着,开始递归遍历左子树,传入左子节点和更新后的深度,一直递归调用,直到到达叶子节点(即没有子节点的节点)为止。depth -= 1是一个还原操作,将深度恢复到递归调用之前的状态。这是为了确保在处理完左子树后,能够正确地继续处理其他子树或返回到上一层节点。

右子树同理。

结合完整代码,题目思路为一层一层向下探索,直到找到叶子节点,更新深度和结果。返回上一层进入另一子树,继续递归,只要发现深度更低的叶子结点就更新之前的深度和结果,直到遍历完所有树。

但应该也有同学发现了,在该代码中更新深度的条件只有是叶子节点且if depth > self.max_depth,那如果最下层只有一个节点,且该节点为右叶子,那这个右叶子算这棵树的左下角的值吗?在该道题目中,按上述代码进行提交,结果是正确的,所以在该题目中如果最下层只有一个节点,且该节点为右叶子,那这个右叶子算这棵树的左下角的值。

方法二:队列迭代

from collections import deque

class Solution:
    def findBottomLeftValue(self, root: TreeNode) -> int:
        queue = deque([root])  # 使用队列来进行广度优先搜索
        while queue:
            node = queue.popleft()  # 弹出当前层的节点
            # 这里重要的是先把右节点入队,再把左节点入队
            if node.right:
                queue.append(node.right)
            if node.left:
                queue.append(node.left)
        # 最后弹出的 node 就是最后一层最左边的节点
        return node.val

首先,将根节点推入队列。只要队列中还有数就继续while循环,把根节点从队列中弹出赋值给node,如果当前node有右子树,先将右子节点推入队列,再将左子节点推入队列。先右后左,这是为了保证每一层先将右侧的节点弹出。结合示例进行分析:

       1
      / \
     2   3
    /   / \
   4   5   6
            \
             7

初始队列为[1],队列存在数进入while循环,弹出队列最左侧的数1作为node,1存在右子节点3,则当前队列为[3],1存在左节点2,则当前队列为[3,2]。队列存在,弹出队列最左侧节点3作为node,3存在右子节点,则当前队列为[2,6],3存在左子节点,则当前队列为[2,6,5]。队列存在,弹出最左侧节点2作为node,2只存在左子节点4,则当前队列为[6,5,4]。队列存在,弹出6作为node,6只存在右子节点7,则当前队列为[5,4,7],一个个弹出,最后弹出7为最后的值。将该代码提交,结果也同样正确,所以在该题目中如果最下层只有一个节点,且该节点为右叶子,那这个右叶子算这棵树的左下角的值。

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

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

相关文章

Django后台数据获取展示

​ 续接Django REST Framework,使用Vite构建Vue3的前端项目 1.跨域获取后台接口并展示 安装Axios npm install axios --save 前端查看后端所有定义的接口 // 访问后端定义的可视化Api接口文档 http://ip:8000/docs/ // 定义的学生类信息 http://ip:8000/api/v1…

Springboot发邮件如何配置SMTP服务器信息?

Springboot发邮件安全性考虑?如何用Springboot发信? 在 SpringBoot中配置邮件发送功能相对简单,但需要正确设置 SMTP 服务器信息。AokSend将详细介绍如何在 SpringBoot应用程序中配置 SMTP 服务器信息,以实现邮件发送功能。 Spr…

如何构建一个高效的编程学习笔记系统(万字总结)

你是否曾经在编程学习的海洋中迷失方向?是否感觉自己学了很多,却总是记不住关键知识点?别担心,今天我们将一起探索一种革命性的笔记方法,它将彻底改变你的学习体验! 目录 引言:为什么我们需要…

鸿蒙(API 12 Beta3版)【本地媒体会话概述】 音视频播控服务

交互过程 本地媒体会话的数据源均在设备本地,交互过程如图所示。 此过程中涉及两大角色,媒体会话提供方和媒体会话控制方。 说明 媒体会话控制方为系统应用,三方应用可以成为媒体会话提供方。 本地媒体会话中,媒体会话提供方通…

[大模型实战] DAMODEL云算力平台部署LLama3.1大语言模型

[大模型实战] DAMODEL云算力平台部署LLama3.1大语言模型 目录 一、LLama3.1二、DAMODEL云算力平台2.1 提供的服务2.1.1 AI训练2.1.2 AI推理2.1.3 高性能计算2.1.4 图像/视频渲染2.1.5 定制化部署 2.2 支持的GPU 三、在DAMODEL部署LLama3.13.1 在DAMODEL创建实例&…

【案例43】打开节点-后台任务日志优化案例

问题现象 通过SPR日志发现 打开节点-后台任务日志节点sql调用严重。 通过nmc查看,后台线程耗时20s ,基本都卡在sql层面 一直在执行如下sql selectl.pk_workingtasklog frompub_workingtasklog l inner joinpub_alertregistry ron l.pkregistry r.pk_a…

Black Forest Labs 的 Flux——文本转图像模型的下一个飞跃,它比 Midjourney 更好吗?

一、前言 Black Forest Labs是开创性稳定扩散模型的团队,现已发布Flux——一套最先进的模型,有望重新定义 AI 生成图像的功能。但 Flux 是否真正代表了该领域的飞跃?它与 Midjourney 等行业领导者相比如何?让我们深入探索 Flux 的…

【Kubernetes】Service 概念与实战

Service 概念与实战 1.通过 Service 向外部暴露 Pod2.Service 的多端口设置3.集群内部的 DNS 服务4.无头 Service 在 Kubernetes 中部署的应用可能对应一个或者多个 Pod,而每个 Pod 又具有独立的 IP 地址。Service(服务)能够为一组功能相同的…

DI (providedIn: XXXModule)

angular版本为^17.3.0; 依赖注入Module 代码结构如下: 点击后为 demo2 works!demo2 providedIn Demo1Module depdemo2 works!demo2 providedIn Demo1Module 打包后大小为 改写为 demo2去掉 imports: [Demo1Module], 打包后大小为 结果比较&#…

DAMA学习笔记(十五)-数据管理组织与角色期望

1.引言 随着数据领域的快速发展,组织需要改进管理和治理数据的方式。当前,大多数组织正面临着越来越多的数据。这些数据格式多样、数量 庞大,并来源于不同的渠道。由于数据数量和种类的增加,加剧了数据 管理的复杂性。与此同时&am…

shiro注解不起作用:shiro进行权限校验时,@RequireRoles(“admin“)注解不起作用的解决方法

今天在写前后端分离项目时,用jwt加shiro进行登录权限校验时,RequireRoles("admin")注解不起作用,记录一下。 前提:数据库里面的user_type代表用户类型 :0普通用户 ;1:专家&#xff1…

Introduction to Snapdragon Profiler (Snapdragon 分析器)

Introduction to Snapdragon Profiler {Snapdragon 分析器} 1. Snapdragon Profiler2. Release Notes3. Tools and resourcesReferences Snapdragon Profiler (骁龙分析器) https://www.qualcomm.com/developer/software/snapdragon-profiler Snapdragon Profiler Documentati…

HAProxy基本配置及参数实操

目录 ​编辑什么是负载均衡 为什么用负载均衡 四层和七层的区别 实验环境 实验步骤 webserver上安装nginx 启动nginx 安装haproxy 编辑配置文件 多进程 多线程 SORRY SERVER 访问重定向 maxconne最大可承受连接 socat 工具 常用示例 ha p r ox y 的 算 法 静 …

思科静态路由配置1

#路由协议实现# #任务一静态路由配置1# #1配置Switch-A的名称及其接口IP地址 Switch>enable Switch(config)#hostname Switch-A Switch-A(config)#ip routing Switch-A(config)#int f0/1 Switch-A(config-if)#no switchport Switch-A(config-if)#ip add 192.168.10…

leetcode日记(72)最大矩形

依旧是看了答案才知道大概方法…太难想到了 和上一道题思路相似!可以直接调用上题的函数,只不过调用前的准备非常难想到,就是建造形状相同的矩阵,第i行j列的元素是i行中j列前相邻的“1”的个数。 class Solution { public:int m…

RS®ZN-Z8x 开关矩阵

R&SZN-Z8x 开关矩阵 专为多端口矢量网络分析仪测量而设计 R&SZN-Z8x 开关矩阵经过优化设计,专门用于罗德与施瓦茨的矢量网络分析仪。这款经济高效的多方位解决方案可用于多端口设备或多个设备的简单和复杂的测量任务。开关矩阵支持宽频率范围&#xff0…

北斗科技助力运动健身:开启智能健身新篇章

近年来,随着科技的迅猛发展,智能化设备已逐渐渗透到健身领域,为运动健身爱好者带来了无尽的利好。作为中国自主研发的全球卫星导航系统,北斗定位技术凭借其高精度和可靠性,正在成为运动健身领域的新宠。本文将深入探讨…

Git相关教程

版本控制 学习目标 理解版本控制的必要性了解常用的版本控制方式熟悉 Git 的使用方法 什么是版本控制 可以把一个版本控制系统理解为一个“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照。当你需要查看一个之前的快照(称之为…

Vue3 el-table里input设置为必填

Vue3 el-table里input设置为必填 Vue3 el-table里input设置为必填页面效果实现代码 Vue3 el-table里input设置为必填 页面效果 实现代码 <template><el-form :model"tableData" ref"formRef"><el-table :data"tableData" style…

MPU6050详细介绍

一、MPU6050介绍 MPU6050是由三个陀螺仪和三个加速度传感器组成的6轴运动处理组件 内部主要结构&#xff1a;陀螺仪、加速度计、数字运动处理器DMP&#xff08;Digital Motion Processor&#xff09; MPU6050有两个IIC接口&#xff0c;第一IIC接口可作为主接口给单片机传输数…