题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/description/

题目叙述:

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

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

示例 1:

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

示例 2:

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

提示:

二叉树的节点个数的范围是 [1,10^4]

-2^31 <= Node.val <= 2^31 - 1

思路:

这题我们有递归和迭代两种写法,我们在这里重点介绍递归的解法,如果用层序遍历的迭代法的话,我们这道题就十分简单了,不过我在后面也会介绍层序遍历的写法。

递归法

递归法我们一定要清楚的是三点:

  1. 我们递归函数要传入的参数和递归函数的返回值
  2. 递归结束的条件(也就是递归的边界)
  3. 单层递归的逻辑

其实本题当中递归里面也蕴含着回溯的逻辑,其实所有的递归算法都离不开回溯,只是我们没有意识到回溯的过程,或者说回溯的过程被隐藏掉了。

下面的代码中我会重点强调回溯的逻辑

步骤1.确定我们的参数和返回值

这题的参数,既然是要求最后一层的最左边的节点,那么我们必然要使用一个参数depth来表示深度,然后我们也需要一个参数maxdepth来表示当前是否是达到了最大的深度,不过这个maxdepth变量不需要

传入函数中,我们可以定义为全局变量,如果depth>maxdepth,就证明当前还未到达最大深度,也就不是我们要处理的最左边的节点了。 同时,我们还需要一个参数result来接收我们需要求得这个节点的节点

值,这个变量我们也定义为全局变量。

确定递归的中止条件

我们要处理的是什么节点?是不是叶子节点,我们处理叶子节点的逻辑判断是什么?是不是只需要当前这个节点它的左右孩子都为空的时候,我们就到达了我们需要处理的时候了,这个时候就是返回的时候了。

那我们要处理这个节点,要做些什么事情呢?——我们要判断当前深度是否是最大深度,如果不是,我们就得更新这个最大深度,同时我们要更新result变量的值,然后再返回,这样就处理好了递归的边界条件,

对吧?

这段逻辑的代码如下:

       //处理到叶子节点就返回
if(cur->left==NULL&&cur->right==NULL){
if(depth>maxdepth){
maxdepth=depth;
result=cur->val;
}
return;
}

单层递归的逻辑

我们现在找到了最深层次的叶子节点,那么我们如何保证它一定是最左边的节点呢?那还不简单嘛!只需要我们处理递归的时候,优先处理左子树,不就能保证我们先处理的是左孩子了嘛!对吧,

这段逻辑的代码如下:

            if(cur->left!=NULL){
//先让depth++,让他处理下一层的节点
depth++;
traversal(cur->left,depth);
//再让depth--,这就是回溯的过程,退到上一层的节点,再处理右边的子树
depth--;
}
if(cur->right!=NULL){
//这里也是一样的道理
depth++;
traversal(cur->right,depth);
//这里也是回溯的过程
depth--;
}

其实,处理好了这几个边界条件,我们的代码就出来了

整体代码:

class Solution {
public:
int result=0;
int maxdepth=INT_MIN;
void traversal(TreeNode*cur,int depth){
//处理到叶子节点就返回
if(cur->left==NULL&&cur->right==NULL){
if(depth>maxdepth){
maxdepth=depth;
result=cur->val;
}
return;
}
if(cur->left!=NULL){
//先让depth++,让他处理下一层的节点
depth++;
traversal(cur->left,depth);
//再让depth--,这就是回溯的过程,退到上一层的节点,再处理右边的子树
depth--;
}
if(cur->right!=NULL){
//这里也是一样的道理
depth++;
traversal(cur->right,depth);
//这里也是回溯的过程
depth--;
}
}
int findBottomLeftValue(TreeNode* root) {
traversal(root,0);
return result;
}
};

层序遍历(迭代法)

其实,这题使用层序遍历才是最方便,最简单的做法。我们只需要处理每一层的第一个元素,然后处理到最后一层,它自然就是最后一层的左边第一个元素了,这题只需要在层序遍历的模板上面改动一点点

就可以实现了!

如果不会层序遍历的话,推荐去看看我的层序遍历的文章,里面详细讲解了层序遍历实现的过程!

层序遍历:https://www.cnblogs.com/Tomorrowland/p/18318744

class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
int result = 0;
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
if (i == 0) result = node->val; // 记录最后一行第一个元素
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
}
return result;
}
};

LeetCode513. 找树左下角的值的更多相关文章

  1. [Swift]LeetCode513. 找树左下角的值 | Find Bottom Left Tree Value

    Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / \ 1 ...

  2. LeetCode 513. 找树左下角的值(Find Bottom Left Tree Value)

    513. 找树左下角的值 513. Find Bottom Left Tree Value 题目描述 给定一个二叉树,在树的最后一行找到最左边的值. LeetCode513. Find Bottom ...

  3. Leetcode之深度优先搜索(DFS)专题-513. 找树左下角的值(Find Bottom Left Tree Value)

    Leetcode之深度优先搜索(DFS)专题-513. 找树左下角的值(Find Bottom Left Tree Value) 深度优先搜索的解题详细介绍,点击 给定一个二叉树,在树的最后一行找到最 ...

  4. Java实现 LeetCode 513 找树左下角的值

    513. 找树左下角的值 给定一个二叉树,在树的最后一行找到最左边的值. 示例 1: 输入: 2 / \ 1 3 输出: 1 示例 2: 输入: 1 / \ 2 3 / / \ 4 5 6 / 7 输 ...

  5. 代码随想录算法训练营day18 | leetcode 513.找树左下角的值 ● 112. 路径总和 113.路径总和ii ● 106.从中序与后序遍历序列构造二叉树

    LeetCode 513.找树左下角的值 分析1.0 二叉树的 最底层 最左边 节点的值,层序遍历获取最后一层首个节点值,记录每一层的首个节点,当没有下一层时,返回这个节点 class Solutio ...

  6. Leetcode513. Find Bottom Left Tree Value找树左下角的值

    给定一个二叉树,在树的最后一行找到最左边的值. 示例 1: 输入: 2 / \ 1 3 输出: 1 示例 2: 输入: 1 / \ 2 3 / / \ 4 5 6 / 7 输出: 7 注意: 您可以假 ...

  7. 513 Find Bottom Left Tree Value 找树左下角的值

    给定一个二叉树,在树的最后一行找到最左边的值. 详见:https://leetcode.com/problems/find-bottom-left-tree-value/description/ C+ ...

  8. 领扣(LeetCode)找树左下角的值 个人题解

    给定一个二叉树,在树的最后一行找到最左边的值. 示例 1: 输入: 2 / \ 1 3 输出: 1 示例 2: 输入: 1 / \ 2 3 / / \ 4 5 6 / 7 输出: 7 注意: 您可以假 ...

  9. 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)

    [题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...

  10. [LeetCode] Find Bottom Left Tree Value 寻找最左下树结点的值

    Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / \ 1 ...

随机推荐

  1. 你不知道的PageContext

    你不知道的PageContext 最近在文艺复兴,学习JSP和Servlet,此文为笔者学习记录. 本文分为以下几个部分: 前言 环境搭建 正文 总结 前言 在我们使用的项目中,存储数据最常用的非 S ...

  2. AI实用技巧 | 5分钟将coze集成到微信群机器人

    细心的小伙伴已经注意到,国内的Coze平台已经开放了API,这一发现让他们感到兴奋不已.因此,他们迫切地想要掌握这一机会,将API应用到实际中,让Coze成为他们的得力助手.这样一来,他们就可以避免每 ...

  3. pidstat 命令查看nginx上下文切换

    pidstat -w -p 711 1 [root@leilei ~]# ps -ef|grep nginx root 13974 1 0 14:23 ? 00:00:00 nginx: master ...

  4. iOS符号表手工还原

    1.通过Xcode的Device工具导出app.crash文件 2.将.crash 和 .dSYM符号 app放在同一个目录中 3.寻找symbolicatecrash,将symbolicatecra ...

  5. Advanced .Net Debugging 9:平台互用性

    一.介绍 这是我的<Advanced .Net Debugging>这个系列的第九篇文章.这篇文章的内容是原书的第二部分的[调试实战]的第七章[互用性].互用性包含两个方面,第一个方面就是 ...

  6. js 禁用右键菜单和禁止复制

    大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...

  7. shell脚本入门学习

    1 参考 [尚硅谷]Shell脚本从入门到实战_哔哩哔哩_bilibili 本文为上面链接的课程学习记录. 2 基础 shell脚本需要shell解释器进行执行,shell解释器就是一个应用程序,有多 ...

  8. Java开发者的神经网络进阶指南:深入探讨交叉熵损失函数

    前言 今天来讲一下损失函数--交叉熵函数,什么是损失函数呢?大体就是真实与预测之间的差异,这个交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异 ...

  9. 嵌入式测试手册——基于NXP iMX6ULL开发板(2)

    基于测试板卡:创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板,由核心板和评估底板组成.核心板经过专业的PCB Layout ...

  10. 韦东山IMX6ULL Linux开发板基于Buildroot系统QT应用环境配置开发运行

    @ 目录 一. 编译系统 1.设置交叉编译工具链 2.编译系统 二. QT下载 1.安装 Qtcreator 2.创建第一个程序 3.配置 QtCreator 开发环境 4.移植QT程序到开发板 一. ...