C++算法练习-day36——513.找树左下角的值

news/2024/11/6 8:08:28 标签: c++, 开发语言

题目来源:. - 力扣(LeetCode)

题目思路分析

题目要求在一个二叉树中找到最底层最左边的节点的值。最底层指的是树的深度最深的一层,而最左边的节点则是该层中最左侧的节点。为了解决这个问题,我们可以使用广度优先搜索(BFS)策略,因为BFS按层次遍历树,这样我们可以确保在处理每一层节点时,总是先处理完上一层的所有节点。在遍历过程中,记录当前层的第一个节点的值,并在遍历完一层时更新该值,直到遍历完所有层,此时记录的值即为最底层最左边的节点的值。

代码:

#include <queue>  
  
// 二叉树节点的定义  
struct TreeNode {  
    int val;  
    TreeNode *left;  
    TreeNode *right;  
    TreeNode() : val(0), left(nullptr), right(nullptr) {}  
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}  
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}  
};  
  
class Solution {  
public:  
    // 使用BFS寻找最底层最左边的节点的值  
    int findBottomLeftValue(TreeNode* root) {  
        // 使用队列来进行广度优先搜索  
        std::queue<TreeNode*> ans;  
        // 初始化队列,将根节点入队  
        ans.push(root);  
        // 初始化val为根节点的值,因为开始时我们默认根节点为最底层最左边的节点  
        int val = root->val;  
          
        // 当队列不为空时,继续遍历  
        while(!ans.empty()){  
            // 获取队列的第一个节点(当前层的第一个节点)  
            TreeNode* pos = ans.front();  
            ans.pop();  
              
            // 更新val为当前节点的值(因为在遍历每一层的第一个节点时会更新val)  
            // 注意:这里只是临时更新,真正的更新发生在遍历完一层之后  
            if(pos->right){  
                // 如果存在右子节点,将其加入队列  
                ans.push(pos->right);  
                // 注意:这里不直接更新val,因为还要检查左子节点  
                // 但由于BFS的特性,左子节点会先于右子节点被处理  
                // 所以,如果左子节点存在,它会覆盖这里的值  
            }  
            if(pos->left){  
                // 如果存在左子节点,将其加入队列  
                ans.push(pos->left);  
                // 更新val为左子节点的值(左子节点会被先处理,因此是有效的更新)  
                val = pos->left->val;  
            }  
            // 注意:这里不需要else,因为右子节点的值可能在左子节点之后被覆盖  
            // 但最终,val会保留为当前层最左边的节点的值  
        }  
        // 遍历完成后,val即为最底层最左边的节点的值  
        return val;  
    }  
};

知识点摘要

  1. 广度优先搜索(BFS):一种图搜索算法,用于遍历或搜索图形数据结构中的节点。BFS从根节点开始,首先访问所有相邻的节点,然后对于每个已访问的节点,再访问它们的所有未访问过的相邻节点,以此类推,直到访问完所有节点。

  2. 队列(Queue):一种先进先出(FIFO)的数据结构,常用于BFS中存储待访问的节点。

  3. 二叉树:一种树形数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点。

通过上述分析,我们了解了如何使用广度优先搜索(BFS)和二叉树的层次遍历来找到最底层最左边的节点的值。BFS通过队列保证了节点按层次顺序被访问,而层次遍历的特性使得我们能够自然地记录每一层的最左边的节点。虽然代码中有一些细节需要注意(如左子节点和右子节点的处理顺序),但整体上,这种方法是直观且有效的。希望这篇文章能帮助你更好地理解和解决类似的问题。


http://www.niftyadmin.cn/n/5740622.html

相关文章

(一)<江科大STM32>——软件环境搭建+新建工程步骤

一、软件环境搭建 &#xff08;1&#xff09;安装 Keil5 MDK 文件路径&#xff1a;江科大stm32入门教程资料/Keil5 MDK/MDK524a.EXE&#xff0c;安装即可&#xff0c;路径不能有中文。 &#xff08;2&#xff09;安装器件支持包 文件路径&#xff1a;江科大stm32入门教程资料…

C# 高精度计时器Stopwatch

C# 高精度计时器Stopwatch 引言经典举例(1)启动和停止方法实例(2)复位和重启方法实例 小结 引言 偶然发现C# 的计时器类Stopwatch&#xff0c;他特别适合测量运行时间&#xff0c;使用简单、计时精确。它源于命名空间System.Diagnostics&#xff0c;使用时必须using引用。 经…

leetcode hot100【LeetCode 46. 全排列】java实现

LeetCode 46. 全排列 题目描述 给定一个没有重复数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] ]Java 实现代码 public class Solution {public List<List<Integer>> permute…

学习党的二十大精神,推动科技创新和发展

党的二十大提出了“创新是引领发展的第一动力”的重要思想&#xff0c;这也是我一直以来坚持的理念。在工作中&#xff0c;注重培养自己的创新精神和实践能力&#xff0c;不断探索前沿科技&#xff0c;提高自己的工作能力和科技创新水平。 网络安全建设是保障国家能源安全、提升…

交换排序与快速排序

交换排序 基本思想: 所谓交换&#xff0c;就是根据序列中元素值进行比较&#xff0c;根据比较结果对两个数据进行位置的相互交换序列中的位置&#xff0c;交换特点&#xff1a;将键值大的元素向序列尾部移动或将键值小的元素向序列的前部移动。 交换排序之冒泡排序 冒泡排序的…

uniapp使用中小问题及解决方法集合

1、 u-input 标签 设置只读、禁用后,click事件不生效 // 解决u-input 标签 设置只读、禁用后,click事件不生效&#xff08;不弹出弹框&#xff09; .input-disabled-click {pointer-events: none; }2、 uniapp实现u-datetime-picker时间选择器的默认日期定位&#xff0c;解决d…

ubuntu工具 -- ubuntu服务器临时没有网络,急需联网下载东西怎么办? 使用手机提供网络

问题 ubuntu服务器配置经常遇到临时需要网络下载文件需求, 通过有线连接又来不及 解决方法 使用手机usb为ubuntu服务器提供网络 先在ubuntu上运行 ifconfig 查看当前的网络接口, 一会看看多了哪个网口 1. 手机端操作 先使用usb数据线将手机连接到服务器上 打开手机的usb共享…

Rust 构建 TCP/UDP 网络服务

第四章 异步编程与网络通信 第二节 构建 TCP/UDP 网络服务 在现代应用程序中&#xff0c;网络通信是核心功能之一。本节将重点介绍如何在 Rust 中构建基本的 TCP 和 UDP 网络服务&#xff0c;涵盖实际的代码示例、最佳实践以及最新的技术方案&#xff0c;以帮助开发者掌握网络…