找树左下角的值

力扣题目链接(opens new window)

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

示例 1:

示例 2:

思路

层序遍历

这个是很自然的思路,因为层序遍历可以避免对于“最底层”这个要求的繁琐判定

在层序遍历的过程中,我们只需要保存最后一层的结果即可

代码

和标准的层序遍历写法一样

class Solution {
public:
//层序遍历
int findBottomLeftValue(TreeNode* root) {
//定义队列
queue<TreeNode*> que;
if(root != NULL) que.push(root);//判定根节点
int res;
while(!que.empty()){//遍历队列
int size = que.size();//记录队列长度
for(int i = 0; i < size; ++i){
TreeNode* node = que.front();
que.pop();
//判断,如果到了最后一层,那么就保存该节点的值
if(i == 0) res = node->val; if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return res;
}
};
递归法

这里使用递归法的话没有层序遍历那么直观,但是因为其涉及到了递归法求深度的概念以及对于回溯的应用,所以还是记录一下

三部曲

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

传入参数是根节点,另需要一个变量记录深度的更新值

void traversal(TreeNode* node, int deep){

}

2、确定终止条件

因为我们是靠递归遍历来不断获取深度的

因此当遇到叶子节点时就要更新当前的深度信息

int maxDeep = INT_MIN;
int res; void traversal(TreeNode* node, int deep){
if(node->left == NULL && node->right == NULL){
if(deep > maxDeep){
maxDeep = deep;//更新深度
//记录当前叶子节点值
res = node->val;
}
return;
}
}

3、确定单层逻辑

使用前序遍历即可,这里依旧要使用回溯

int maxDeep = INT_MIN;
int res; void traversal(TreeNode* node, int deep){
if(node->left == NULL && node->right == NULL){
if(deep > maxDeep){
maxDeep = deep;//更新深度
//记录当前叶子节点值
res = node->val;
}
return;
} if(node->left){
//记录深度
deep++;
traversal(node, deep);
//回溯,深度减1
deep--;
}
if(node->right){
//记录深度
deep++;
traversal(node, deep);
//回溯,深度减1
deep--;
}
return;
}

这里使用回溯的主要目的是为了让每个分支都能被遍历到,进而确认每个叶子节点,获取最底层的那个

代码
class Solution {
public:
//递归
//确定递归函数的参数和返回值
int maxDeep = INT_MIN;
int res; void traversal(TreeNode* node, int deep){
if(node->left == NULL && node->right == NULL){
if(deep > maxDeep){
maxDeep = deep;//更新深度
//记录当前叶子节点值
res = node->val;
}
return;
} if(node->left){
//记录深度
deep++;
traversal(node->left, deep);
//回溯,深度减1
deep--;
}
if(node->right){
//记录深度
deep++;
traversal(node->right, deep);
//回溯,深度减1
deep--;
}
return;
} int findBottomLeftValue(TreeNode* root) {
int deep = 0;
traversal(root, deep);
return res;
}
};

【LeetCode二叉树#08】寻找树左下角的值(回溯机制X深度)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. [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 ...

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

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

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

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

  9. leetcode刷题记录——树

    递归 104.二叉树的最大深度 /** * Definition for a binary tree node. * public class TreeNode { * int val; * Tree ...

  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. [转帖]15 个必须知道的 chrome 开发工具技巧

    在Web开发者中,Google Chrome是使用最广泛的浏览器.六周一次的发布周期和一套强大的不断扩大开发功能,使其成为了web开发者必备的工具.你可能已经熟悉了它的部分功能,如使用console和 ...

  2. [转贴]win10临时修改、永久cmd 编码格式的方法

    https://www.jianshu.com/p/40a9fbaf1cac   cmd 前言 有时候,运行一些命令行程序某些字符无法正常显示,常见的就是方块,或者是火星文字都是由于 cmd 程序的默 ...

  3. open,os模块的常用函数

    一.open用于读写文件 1.open的基本语法 : open(file,mode,buffering,encoding,errors.........),open中有如下几个参数,一般情况 下我们只 ...

  4. js设置setAttribute、获取getAttribute、删除removeAttribute详细讲解

    setAttribute的理解 所有主流浏览器均支持 setAttribute() 方法. element.setAttribute(keys,cont) keys==>必需(String类型) ...

  5. 替换 &开头。;结尾之间的内容。用空格代替他们

    替换 &开头.;结尾之间的内容.用空格代替他们 var regExp = /\&.*?\;/g; var str = '123&asdsa;dqwe'; str = str.r ...

  6. Vue基础系统文章07---webpack安装和配置与打包

    1.当前web开发困境 a.文件依赖关系错综复杂 b.静态资源请求效率低 c.模块化支持不友好 d.浏览器对高级js兼容性低 例如:模块代码实现隔行换色 1)在新建空白文件夹中运行:npm init ...

  7. 遇到一个bug,组件不更新内容

    解决办法 当v-if的值发生变化时,组件都会被重新渲染一遍.因此,利用v-if指令的特性,可以达到强制刷新组件的目的. <template> <comp v-if="upd ...

  8. NLP文本匹配任务Text Matching [无监督训练]:SimCSE、ESimCSE、DiffCSE 项目实践

    NLP文本匹配任务Text Matching [无监督训练]:SimCSE.ESimCSE.DiffCSE 项目实践 文本匹配多用于计算两个文本之间的相似度,该示例会基于 ESimCSE 实现一个无监 ...

  9. 【七】强化学习之Policy Gradient---PaddlePaddlle【PARL】框架{飞桨}

    相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...

  10. 3.3 Windows驱动开发:内核MDL读写进程内存

    MDL内存读写是一种通过创建MDL结构体来实现跨进程内存读写的方式.在Windows操作系统中,每个进程都有自己独立的虚拟地址空间,不同进程之间的内存空间是隔离的.因此,要在一个进程中读取或写入另一个 ...