【LeetCode每日一题】【BFS模版与例题】863.二叉树中所有距离为 K 的结点

BFS的基本概念

BFS 是广度优先搜索(Breadth-First Search)的缩写,是一种图遍历算法。它从给定的起始节点开始,逐层遍历图中的节点,直到遍历到目标节点或者遍历完所有可达节点。

BFS 算法的核心思想是先访问当前节点的所有邻居节点,然后再访问邻居节点的邻居节点,依此类推,直到遍历完整个图。

BFS 模版

BFS 使用队列(Queue)数据结构来辅助实现,它按照先进先出(FIFO)的顺序管理待访问的节点。用**集合(Set)**来辅助节点是否已经被访问,算法的基本流程如下:

  • 将起始节点放入队列中,并标记为已访问。
  • 从队列中取出一个节点,访问该节点,判断该节点是否符合条件。
  • 将该节点的所有未访问过的邻居节点加入队列,并标记为已访问。
  • 重复步骤 2 和步骤 3,直到队列为空。

模版1:不必记录深度

function BFS(start, target) {const queue = []; // 核心数据结构const visited = new Set(); // 避免走回头路// 将起始节点放入队列中,并标记为已访问。queue.push(start); visited.add(start);while (queue.length > 0) {const sz = queue.length;const cur = queue.shift();/* 划重点:这里判断是否到达终点 */if (cur === target)return step;/* 将 cur 的所有未访问过的邻居节点加入队列,并标记为已访问。 */for (const x of cur.adj()) {if (!visited.has(x)) {queue.push(x);visited.add(x);}}}
}

模版2:需要记录深度的

function BFS(start, target) {const queue = []; // 核心数据结构const visited = new Set(); // 避免走回头路// 将起始节点放入队列中,并标记为已访问。queue.push(start); visited.add(start);let step = 0; // 记录扩散的步数while (queue.length > 0) {const sz = queue.length;/* 将当前队列中的所有节点向四周扩散 */for (let i = 0; i < sz; i++) {const cur = queue.shift();/* 划重点:这里判断是否到达终点 */if (cur === target)return step;/* 将 cur 的所有未访问过的邻居节点加入队列,并标记为已访问。 */for (const x of cur.adj()) {if (!visited.has(x)) {queue.push(x);visited.add(x);}}}/* 划重点:更新步数在这里 */step++;}
}

BFS 算法通常用于以下场景:

  • 寻找两个节点之间的最短路径。
  • 在树或图中寻找特定深度或层级的节点。
  • 检查图是否是连通的。
  • 拓扑排序。
  • 解决迷宫问题等。

例题

111 二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。


var minDepth = function(root) {if(root === null){return 0;}// 记录深度let step = 0;// BFS关键数据结构let queue = [];let visited = new Set();queue.push(root);visited.add(root);while(queue.length > 0){let size = queue.length;for(let i = 0;i<size;i++){/* 划重点:这里判断是否到达终点 */let node = queue.shift();if(node.left === null && node.right === null){return step+1;}/* 将 cur 的所有未访问过的邻居节点加入队列,并标记为已访问。 */if(node.left !== null && !visited.has(node.left)){queue.push(node.left);visited.add(node.left);}if(node.right !== null && !visited.has(node.right)){queue.push(node.right);visited.add(node.right);}}step++;}return step;
};

863.二叉树中所有距离为 K 的结点

给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 k 。

返回到目标结点 target 距离为 k 的所有结点的值的列表。 答案可以以 任何顺序 返回。

思路:
需要我们在树中寻找特定深度或层级的节点,但是又不是从根节点开始,因此需要我们将树 转化成 图。
可以通过哈希表和DFS将树转化成图

var distanceK = function(root, target, k) {// 起点是target,先通过哈希表+DFS将树转化成图const parents = getParents(root);// 结果数组let ans = []// BFS关键数据结构let queue = []const visited = new Set()queue.push(target);visited.add(target.val);// 记录深度let step = 0;while(queue.length){// 遍历每一层的节点const len = queue.length;for(let i = 0;i<len;i++){// 判断当前节点是否符合条件。const node = queue.shift();if(step === k){ans.push(node.val);}// 将相邻的节点都放入到if(node.left && !visited.has(node.left.val)){queue.push(node.left);visited.add(node.left.val);}if(node.right && !visited.has(node.right.val)){queue.push(node.right);visited.add(node.right.val);}if(parents.has(node.val) && !visited.has(parents.get(node.val).val)){queue.push(parents.get(node.val));visited.add(parents.get(node.val).val);}}// 遍历完一层后深度+1step++;}return ans;};function getParents(root) {const parents = new Map();const findParents = (root) => {if (root.left) {parents.set(root.left.val, root);findParents(root.left);}if (root.right) {parents.set(root.right.val, root);findParents(root.right);}};findParents(root);return parents;
}

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

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

相关文章

计算机网络_2.2物理层下面的传输媒体

2.2物理层下面的传输媒体 一、传输媒体的分类二、导向型传输媒体1、同轴电缆2、双绞线3、光纤&#xff08;1&#xff09;光纤通信原理&#xff08;2&#xff09;光纤组成&#xff08;4&#xff09;多模光纤与单模光纤对比&#xff08;5&#xff09;光纤的波长与规格&#xff08…

海量淘宝商品数据如何实现自动化抓取?

随着电子商务的飞速发展&#xff0c;淘宝作为中国最大的网络购物平台之一&#xff0c;其商品数据具有极高的商业价值。然而&#xff0c;如何有效地从海量的淘宝商品数据中抓取所需信息&#xff0c;成为了一个技术挑战。本文将深入探讨如何实现淘宝商品数据的自动化抓取&#xf…

c# using 用法

using命令空间 导入命名空间中的所有类型 如&#xff1a;using System.Text; using别名 using别名包括详细命名空间信息的具体类型&#xff0c;这种做法有个好处就是当同一个cs引用了两个不同的命名空间&#xff0c;但两个命名空间都包括了一个相同名字的类型的时候。当需要…

SQL加锁机制深度解析:不同隔离级别与索引类型的影响

首先&#xff0c;我们先理解一下涉及的几个核心概念&#xff1a; 主键 (Primary Key): 主键是数据库表中的特殊列&#xff0c;用于唯一标识表中的每一行。它不能有重复值&#xff0c;也不能有NULL值。 唯一索引 (Unique Index): 唯一索引类似于主键&#xff0c;但它允许NULL值…

数据可视化基础与应用-02-基于powerbi实现连锁糕点店数据集的仪表盘制作

总结 本系列是数据可视化基础与应用的第02篇&#xff0c;主要介绍基于powerbi实现一个连锁糕点店数据集的仪表盘制作。 数据集描述 有一个数据集&#xff0c;包含四张工作簿&#xff0c;每个工作簿是一张表&#xff0c;其中可以销售表可以划分为事实表&#xff0c;产品表&am…

【Python小技巧】将list变量写入本地txt文件并读出为list变量的方法(附代码)

文章目录 前言一、万能的txt和eval大法二、具体代码和使用方法总结 前言 使用Python&#xff0c;我们偶尔需要将一些变量保存到本地&#xff0c;并被其它代码读取作为参数&#xff0c;那么怎么办呢&#xff1f; 一、万能的txt和eval大法 这里教大家一个简单的方法&#xff0c…

912. 排序数组(快速排序)

快速排序&#xff1a; 分&#xff1a;找到分成两部分进行排序的pos&#xff08;使用partition&#xff09;治&#xff1a;分别对这两部分进行快速排序 重点&#xff1a;partition 找到pivot&#xff08;两个方法&#xff1a;1. 取第一个值&#xff1b;2. 取随机值&#xff09…

Linux时间同步(PPS、PTP、chrony)分析笔记

1 PPS(pulse per second) 1.1 简介 LinuxPPS provides a programming interface (API) to define in the system several PPS sources. PPS means "pulse per second" and a PPS source is just a device which provides a high precision signal each second so t…

每日一题 2673使二叉树所有路径值相等的最小代价

2673. 使二叉树所有路径值相等的最小代价 题目描述&#xff1a; 给你一个整数 n 表示一棵 满二叉树 里面节点的数目&#xff0c;节点编号从 1 到 n 。根节点编号为 1 &#xff0c;树中每个非叶子节点 i 都有两个孩子&#xff0c;分别是左孩子 2 * i 和右孩子 2 * i 1 。 树…

Java缓存简介

内存访问速度和硬盘访问速度是计算机系统中两个非常重要的性能指标。 内存访问速度&#xff1a;内存是计算机中最快的存储介质&#xff0c;它的访问速度可以达到几纳秒级别。内存中的数据可以直接被CPU访问&#xff0c;因此读写速度非常快。 硬盘访问速度&…

学习和工作的投入产出比(节选)

人工智能统领全文 推荐包含关于投入、产出、过剩、市场关注、案例、结果和避雷等主题的信息&#xff1a; 投入与产出&#xff1a; 投入和产出都有直接和间接两类常见形式。常见的四种组合是&#xff1a;直接投入、直接产出、间接投入、间接产出。 过剩&#xff1a; 过剩是一个重…

力扣SQL50 无效的推文 查询

Problem: 1683. 无效的推文 思路 &#x1f468;‍&#x1f3eb; 参考 char_length(str)&#xff1a;计算 str 的字符长度length(str)&#xff1a;计算 str 的字节长度 Code select tweet_id from Tweets where char_length(content) > 15;

C++与 Fluke5500A设备通过GPIB-USB-B通信的经验积累

C与 Fluke5500A设备通过GPIB-USB-B通信的经验积累 以下内容来自&#xff1a;C与 Fluke5500A设备通过GPIB-USB-B通信的经验积累 - JMarcus - 博客园 (cnblogs.com)START 1.需要安装NI-488.2.281&#xff0c;安装好了之后&#xff0c;GPIB-USB-B的驱动就自动安装好了 注意版本…

动态规划(算法竞赛、蓝桥杯)--单调队列滑动窗口与连续子序列的最大和

1、B站视频链接&#xff1a;E11【模板】单调队列 滑动窗口最值_哔哩哔哩_bilibili 题目链接&#xff1a;滑动窗口 /【模板】单调队列 - 洛谷 #include <bits/stdc.h> using namespace std; const int N1000010; int a[N],q[N];//q存的是元素的下标 int main(){int n,k;…

unity学习(41)——创建(create)角色脚本(panel)——UserHandler(收)+CreateClick(发)——创建发包!

1.客户端的程序结构被我精简过&#xff0c;现在去MessageManager.cs中增加一个UserHandler函数&#xff0c;根据收到的包做对应的GameInfo赋值。 2.在Model文件夹下新增一个协议文件UserProtocol&#xff0c;内容很简单。 using System;public class UserProtocol {public co…

金融短信群发平台具有那些特点

金融短信群发平台的特点主要包括以下几个方面&#xff1a; 1.高效性&#xff1a;金融短信群发平台能够快速地发送大量的短信&#xff0c;使得金融信息能够迅速传达给目标客户&#xff0c;保证了信息的及时性和有效性。 2.安全性&#xff1a;金融短信群发平台对于信息的安全性非…

蓝桥杯练习系统(算法训练)ALGO-995 24点

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 24点游戏是一个非常有意思的游戏&#xff0c;很流行&#xff0c;玩法很简单&#xff1a;给你4张牌&#xff0c;每张牌上有数…

【JS】sort方法的基本使用与双重、多重排序:对象数组按照多个对象属性进行排序

【JS】对象数组按照多个对象属性进行排序&#xff08;sort方法&#xff09; 一、sort():用于对数组的元素进行排序,并返回数组&#xff0c;arr.sort()默认为升序排列二、sort()用法三、双重、多重排序&#xff1a;对象数组按照多个对象属性进行排序&#xff08;sort方法&#x…

设备树学习(DOING)

我的理解本质上还是复用。尤其是嵌入式领域&#xff0c;设备多种多样&#xff0c;但是很多设备接口都是标准的&#xff0c;或者大同小异。以前驱动开发可能每个设备商都去抄别家的搞进内核&#xff0c;这样造成了大量的垃圾代码。后面linux内核就把这些做成公共库抽象出来&…

SpringBoot整合Kafka

SpringBoot整合Kafka的步骤如下&#xff1a; 添加依赖&#xff1a;在SpringBoot项目的pom.xml文件中添加Kafka的依赖。 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>版本号…