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

513 找树左下角的值

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

思路

层序遍历

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

class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.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 = depthself.result = node.val
  1. 确定单层递归的逻辑

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

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

完整代码:

# 法二 采用递归法 巧妙利用深度来判断是否是最后一行 前序遍历
class Solution(object):def findBottomLeftValue(self, root):self.max_depth = float("-inf") # 记住写法self.result = Noneself.traversal(root, 0) # 初始深度赋值为0return 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 = depthself.result = node.val# 左if node.left:depth += 1self.traversal(node.left, depth)depth -= 1 # 回溯# 右if node.right:depth += 1self.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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置策略路由(基于IP地址)示例

策略路由简介 定义 策略路由PBR(Policy-Based Routing)是一种依据用户制定的策略进行路由选择的机制,其优先级高于直连路由、静态路由和通过动态路由协议生成的路由。设备配置策略路由后,若接收的报文(包括二层报文&…

LCR 146. 螺旋遍历二维数组

解题思路&#xff1a; class Solution {public int[] spiralArray(int[][] array) {if(array.length 0) return new int[0];int l 0, r array[0].length - 1;int t 0, b array.length - 1;int x 0;int[] res new int[(r 1) * (b 1)];while(true) {for(int i l; i <…

geemap学习笔记028:Landsat8计算时间序列NDVI并导出

前言 本节则是以Landsat8影像数据为例&#xff0c;进行NDVI时间序列计算&#xff0c;并将得到的时间序列NDVI进行展示并导出。 1 导入库并显示地图 import ee import geemap import datetime import pandas as pd import os ee.Initialize()2 定义时间范围 # 定义日期范围 …

c语言:判断是否为整数|练习题

一、题目 输入一个数字&#xff0c;判断该数字是否为整数 如图&#xff1a; 二、思路分析 1、没有小数部分的数字&#xff0c;即为整数。所以&#xff0c;只要知道该数字是否有小数部分&#xff0c;即可。 2、例子&#xff1a;1.5减去10.5&#xff0c;由于有小数部分&#xff0…

GEE(ccdc-1)——利用Landsat系列影像获取研究区范围的多波段影像(包含ccdc中已经定义的多波段)

简介 在进行CCDC监测时,我们首先要做的就是获取研究区的长时间序列影像,让其保存在你的资产中,方便后面调用,这里我们要做的额就是根据代码,将我们时间范围进行选取和指定的研究区边界,剩下的采用默认参数即可。最后出现的结果是将ccdc代码中所需要的波段和影像中一些光…

mysql innodb知识记录

官方文档 官网架构图 innodb 特性 内存 buffer pool 采用优化后的LRU算法&#xff0c; 3/8 of the buffer pool is devoted to the old sublist.The midpoint of the list is the boundary where the tail of the new sublist meets the head of the old sublist.When In…

ensp创建配置环境,实现全网互访

文章目录 创建配置环境&#xff0c;实现全网互访配置步骤接入层交换机&#xff08;sw4、sw5&#xff09;划分vlan汇聚层交换机&#xff08;sw2、sw3&#xff09;配置ip地址作为vlan网关、与sw1 ip地址直连核心层交换机&#xff08;sw1&#xff09;配置ip地址与汇聚层交换机&…

容器技术:从虚拟机到轻量级容器的革命

一、引言 首先&#xff0c;什么是容器&#xff1f; 容器是一种沙盒技术&#xff0c;主要目的是为了将应用运行在其中&#xff0c;与外界隔离&#xff1b;及方便这个沙盒可以被转移到其它宿主机器。本质上&#xff0c;它是一个特殊的进程。通过名称空间&#xff08;Namespace&a…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《计及调频能力和经济效益的储能集群多状态区间优化策略》

这个标题提到了三个关键概念&#xff1a;储能集群、调频能力和经济效益&#xff0c;以及多状态区间优化策略。下面我将为你解释每个概念的含义&#xff0c;并对整个标题进行解读。 首先&#xff0c;"储能集群"是指将多个储能系统连接在一起形成一个集群&#xff0c;…

【算法】bfs与dfs算法解决FloodFill(洪流)问题(C++)

文章目录 1. 什么是FloodFill问题2. 用什么方法解决FloodFill问题3. 具体例题773.图像渲染200.岛屿数量695.岛屿的最大面积130.被围绕的区域 1. 什么是FloodFill问题 一般floodfill问题可以描述为&#xff1a;给定一个二维矩阵&#xff0c;其中每个元素代表一个像素点&#xf…

HarmonyOS4.0从零开始的开发教程18HarmonyOS应用/元服务上架

HarmonyOS&#xff08;十六&#xff09;HarmonyOS应用/元服务上架 简介 随着生活节奏的加快&#xff0c;我们有时会忘记一些重要的事情或日子&#xff0c;所以提醒功能必不可少。应用可能需要在指定的时刻&#xff0c;向用户发送一些业务提醒通知。例如购物类应用&#xff0c…

1264. 动态求连续区间和(树状数组---某个位置加上一个数/求在线(动态)前缀和/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 10 5 1 2 3 4 5 6 7 8 9 10 1 1 5 0 1 3 0 4 8 1 7 5 0 4 8输出样例&#xff1a; 11 30 35 树状数组&#xff1a; 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std;const int N100010; int n,…