【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.pswp.cn/news/712542.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712542.shtml
英文地址,請注明出處:http://en.pswp.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>版本號…