力扣刷题-二叉树-找树左下角的值

513 找树左下角的值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
示例 1:
image.png
示例 2:
image.png

思路

层序遍历

直接层序遍历,因为题目说了是最底层,最左边的值,所以就是层序遍历最后一层的第一个值。

class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

# 法一 采用层序遍历
from collections import deque
class Solution(object):
    def findBottomLeftValue(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        queue = deque([root])
        result = []
        while queue:
            level_result = []
            for _ in range(len(queue)):
                node = queue.popleft()
                level_result.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            result.append(level_result)
        return result[-1][0] # 题目说了最底层

层序遍历法很好理解

递归法

我们来分析一下题目:在树的最后一行找到最左边的值。
首先要是最后一行,然后是最左边的值。
如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行。
那么如何找最左边的呢?可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索(相对右,因为题目说是最左边的),然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。
递归三部曲:

  1. 确定递归函数的参数和返回值

参数必须有要遍历的树的节点(采用node一般化),还有就是一个变量用来记录最长深度。
本题还需要类里的两个全局变量,max_depth用来记录最大深度,result记录最大深度最左节点的数值。(采用slef初始化)

# 1. 传入一个记录深度的变量 传入一个结点
def traversal(self, node, depth):
    # 2. 当结点是叶子结点的时候 就计算深度
  1. 确定终止条件

当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度。

# 中
if not node.left and not node.right:
    if depth > self.max_depth:
        self.max_depth = depth
        self.result = node.val
  1. 确定单层递归的逻辑

在找最大深度的时候,递归的过程中依然要使用回溯,代码如下:

# 左
if node.left:
    depth += 1
    self.traversal(node.left, depth)
    depth -= 1 # 回溯

# 右
if node.right:
    depth += 1
    self.traversal(node.right, depth)
    depth -= 1 # 回溯

完整代码:

# 法二 采用递归法 巧妙利用深度来判断是否是最后一行 前序遍历
class Solution(object):
    def findBottomLeftValue(self, root):
        self.max_depth = float("-inf") # 记住写法
        self.result = None
        self.traversal(root, 0) # 初始深度赋值为0
        return self.result


    # 因为需要遍历来判断深度 所以写一个新函数(也可以不用)
    # 1. 传入一个记录深度的变量 传入一个结点
    def traversal(self, node, depth):
        # 2. 当结点是叶子结点的时候 就计算深度
        # 中
        if not node.left and not node.right:
            if depth > self.max_depth:
                self.max_depth = depth
                self.result = node.val
        # 左
        if node.left:
            depth += 1
            self.traversal(node.left, depth)
            depth -= 1 # 回溯
        
        # 右
        if node.right:
            depth += 1
            self.traversal(node.right, depth)
            depth -= 1 # 回溯

参考:
https://www.programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构—队列的实现】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、队列 1.1队列的概念及结构 二、队列的实现 2.1头文件的实现—Queue.h 2.2源文件的实现—Queue.c 2.3源文件的测试—test.c 三、测试队列实际数据的展示 3.…

mysql使用st_distance_sphere函数报错Incorrect arguments to st_distance_sphere

前言 最近使用空间点位查询数据时函数报错Incorrect arguments to st_distance_sphere报错。 发现问题 因为之前是没有问题的,所以把问题指向了数据,因为是外部数据,不是通过系统打点获取,发现是因为经纬度反了,loc…

VRRP(虚拟路由冗余协议)

一.VRRP简介 1.VRRP是什么 Virtual route Redundancy Protocol,也叫虚拟路由器冗余协议。 利用VRRP,一组路由器协同工作,单只有一个处于Master状态,处于该状态的路由器(的接口)承担实际的数据流量转发任…

MapReduce序列化实例代码

1 )需求:统计每个学号该月的超市消费、食堂消费、总消费 2 )输入数据格式 序号 学号 超市消费 食堂消费 18 202200153105 8.78 12 3 )期望输出格式 key (学号) value ( bean 对象&#xf…

二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现

二分查找的概念 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 实现原理 首先,假设表中元素是按升序…

深度学习项目实战:垃圾分类系统

简介: 今天开启深度学习另一板块。就是计算机视觉方向,这里主要讨论图像分类任务–垃圾分类系统。其实这个项目早在19年的时候,我就写好了一个版本了。之前使用的是python搭建深度学习网络,然后前后端交互的采用的是java spring …

VLAN间的通讯---三层交换

一.三层交换 1.概念 使用三层交换技术实现VLAN间通信 三层交换二层交换 三层转发 2.基于CEF的MLS CEF是一种基于拓补转发的模型 转发信息库(FIB)临接关系表 转发信息库(FIB)可以理解为路由表 邻接关系表可以理解为MAC地址表…

js获取日期

目录 Date 对象 1. 获取当前时间 2. 获取特定日期时间 Date 对象的方法 1. 获取各种日期时间组件 2. 获取星期几 3. 获取时间戳 格式化日期时间 1. 使用 toLocaleString() 方法 2. 使用第三方库 UNIX 时间戳 内部表示 时区 Date 对象 JavaScript中内置的 Date 对象…

【sqli靶场】第六关和第七关通关思路

目录 前言 一、sqli靶场第六关 1.1 判断注入类型 1.2 观察报错 1.3 使用extractvalue函数报错 1.4 爆出数据库中的表名 二、sqli靶场第七关 1.1 判断注入类型 1.2 判断数据表中的字段数 1.3 提示 1.4 构造poc爆库名 1.5 构造poc爆表名 1.6 构造poc爆字段名 1.7 构造poc获取账…

MySQL 报错 You can‘t specify target table for update in FROM clause解决办法

You can’t specify target table for update in FROM clause 其含义是:不能在同一表中查询的数据作为同一表的更新数 单独执行复合查询是正常的,如下: 但是当执行子查询删除命令时,报如下错误 DELETE FROM abpusers WHERE Id I…

SLAM学习笔记001

当向机器人下达移动到地点B的命令后,机器人不免会问三个颇具哲学性的问题,即“我在哪儿”“我将到何处去”“我该如何去”。slam导航技术涵盖:航天、军事、特种作业、工业生产、智慧交通、消费娱乐等slam导航的经典应用:火星探测车…

vue3父组件调用子组件el-dialog对话框

vue3父组件调用子组件el-dialog对话框 在写项目的时候,经常要使用父子组件通讯,我已经写了很多篇博客来介绍父子组件通讯了,vue中的父子组件通讯方式有差不多10来种,最常用的就那么一两种,这里我介绍其中我认为最基础…

【计算机网络】—— 详解码元,传输速率的计算|网络奇缘系列|计算机网络

🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 目录 码元 速率和波特 思考1 思考2 思考3 带宽(Bandwidth) 📝总结 码元…

【Vulnhub 靶场】【IA: Keyring (1.0.1)】【中等】【20210730】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/ia-keyring-101,718/ 靶场下载:https://download.vulnhub.com/ia/keyring-v1.01.ova 靶场难度:中等 发布日期:2021年07月30日 文件大小:1.1 GB 靶场作者&#xf…

操作系统基础知识

本文用于记录学习W3schools的操作系统教程。 操作系统基础知识 操作系统概括操作系统的8个组件1 流程管理2 I/O设备管理3 文件管理4 网络管理5 内存管理6 磁盘管理(辅助存储管理)7 安全管理8 命令解释系统 操作系统类型 操作系统概括 操作系统: 计算机系统可以分为…

Threejs利用着色器编写动态飞线特效

一、导语 动态飞线特效是可视化数据地图中常见的需求之一,鼠标点击的区块作为终点,从其他区块飞线至点击区块,附带颜色变换或者结合粒子动画 二、分析 利用创建3点来构成贝塞尔曲线,形成线段利用着色器材质来按照线段以及时间…

[C++] 多态(上) -- 抽象类、虚函数、虚函数表

文章目录 1、多态的概念2、多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数的重写2.4 虚函数重写的两个例外2.4.1 协变(基类与派生类虚函数返回值类型不同) 2.4.2 析构函数的重写(基类与派生类析在这里插入图片描述2.4.3 选择题测试 2.5 C11 final 和 override2.5.1 f…

web(HTML之表单练习)

使用HTML实现该界面: 要求如下: 用户名为文本框,名称为 UserName,长度为 15,最大字符数为 20。 密码为密码框,名称为 UserPass,长度为 15,最大字符数为 20。 性别为两个单选按钮&a…

Linux 下的PROC虚拟文件夹的介绍

#江南的江 #每日鸡汤:其一半亩方塘一鉴开,天光云影共徘徊。问渠哪得清如许?为有源头活水来 #初心和目标:在网络安全中崭露头角 PROC 一.proc的文件里的文件是对于计算机的基本信息的介绍。 其中数字文件是代表着进程,其余的例如cpuinfo…

人工智能:机器与人类的对决

一、引言 随着科技的飞速发展,人工智能已经逐渐渗透到我们生活的方方面面。从智能手机到自动驾驶汽车,从语音识别到机器翻译,人工智能已经成为我们生活中不可或缺的一部分。然而,随着人工智能的不断演进,人们开始担心…