找树左下角的值

力扣题目链接(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. [转帖]超能课堂(323) 为什么WiFi实际速率只有标称速率的一半?

    超能课堂(323) 为什么WiFi实际速率只有标称速率的一半? 开始的地方 协议速率与实际速率有何不同? 什么是"全双工"与"半双工"? 无线网络与有线网络的抗 ...

  2. [转帖]【k8s】1、基础概念和架构及组件

    文章目录 一.kubernetes概述 1.什么是kubernetes? 2.应用程序部署方式的演变 3.为什么要用kubernetes? 二.kubernetes 特性 三.Kubernetes集群 ...

  3. AIGC的隐私安全问题及隐私保护技术

    作者:京东科技 杨博 ChatGPT 才出现两个月,就已经引起了学术界的关注.微软成为ChatGPT母公司OpenAI的合作伙伴,并确认投资百亿美元.同时,微软正计划将 OpenAI 的技术整合到其产 ...

  4. 【dp,建模】AGC032D Rotation Sort

    Problem Link 有一个长为 \(n\) 的排列 \(p\),给定 \(A,B\),你每次可以做以下两种操作之一: 选取 \(l,r\),将 \(p[l:r]\) 循环右移,代价为 \(A\) ...

  5. 文件上传change事件只执行一次的问题

    参考地址:https://blog.csdn.net/john_xiaoweige/article/details/81392110 本节中的注意点: this.$refs.attenceInput. ...

  6. 【JS 逆向百例】转变思路,少走弯路,X米加密分析

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:X米账号登 ...

  7. Windows 核心编程笔记 [1] Windows 错误处理

    [1] Windows 错误处理 1. 关于windows系统函数的返回值错误处理 VOID:这个函数不可能失败 BOOL:如果函数调用失败,返回值为0,即为FALSE,否则为非0值,即为TRUE H ...

  8. Python Coroutine 池化实现

    Python Coroutine 池化实现 池化介绍 在当今计算机科学和软件工程的领域中,池化技术如线程池.连接池和对象池等已经成为优化资源利用率和提高软件性能的重要工具.然而,在 Python 的协 ...

  9. 设计模式-1 单例模式 SingletonPattern

    23种设计模式 一.创建型 1,AbstractFactory(抽象工厂,对象模式) 2,Builder(建造者,对象模式) 3,Factory Method(工厂方法,类创模式) 4,Prototy ...

  10. 可选可输入的input框

    <input type="text" list="note" autocomplete="off"> <datalist ...