二叉樹——隊列bfs專題

1.N叉樹的層序遍歷

我們之前遇到過二叉樹的層序遍歷,只需要用隊列先進先出的特性就可以達到層序遍歷的目的。

而這里不是二叉樹,也就是說讓節點的孩子入隊列時不僅僅是左右孩子了,而是它的所有孩子。而我們看這棵多叉樹的構造,它的孩子是存儲在數組中的。所以我們在讓孩子入隊時只需要依次讓數組中的所有節點入隊列即可。

class Node 
{
public:int val;vector<Node*> children;
};

而這道題的要求是返回一個二維數組,數組的元素就是每一層的層序遍歷結果。

我們關鍵點就在于如果確定元素屬于那一層,方法就是在進行層序遍歷前,我們先統計該隊列的大小,大小即使這一層元素的個數,當這個數變為0,表示這一層的元素已經統計完了,這時隊列中的就是下一層的元素了。此時重復求大小和層序遍歷的過程即可。

class Solution 
{
public:vector<vector<int>> levelOrder(Node* root) {if(root == nullptr) return {};queue<Node*> q;q.push(root);vector<vector<int>> ret;int currentFloorSize = 0;while(!q.empty()){vector<int> currentFloor;currentFloorSize = q.size();while(currentFloorSize--){Node* head = q.front(); //獲取隊頭元素for(int i=0; i<head->children.size(); ++i) //讓隊頭孩子入隊{q.emplace(head->children[i]);}currentFloor.emplace_back(head->val);//保存隊頭valq.pop();//出隊}ret.emplace_back(currentFloor);}return ret;}
};

2.二叉樹的鋸齒形層序遍歷

依舊是二叉樹的層序遍歷,只不過在遍歷的時候有順序之分,奇數層從左到右,偶數層從右到左。

解法依舊是先采取正常的層序遍歷,多定義一個flag變量用了記錄當前是奇數還是偶數。當把這一行統計完畢后,在將該結果插入到數組之前,先對flag進行判斷,如果是偶數就插入反轉之后的數組,如果奇數則直接插入即可。

class Solution 
{
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {if(root == nullptr) return {};// 根節點入隊列queue<TreeNode*> q;q.emplace(root);vector<vector<int>> ret;int currentFloorSize =0;int flag = 1; // 遍歷層的方向,奇數層left->right, 偶數層right->leftwhile(!q.empty()){currentFloorSize = q.size();vector<int> currentFloorEele;while(currentFloorSize--){   // 保存節點數據TreeNode* head = q.front();q.pop();currentFloorEele.emplace_back(head->val);// 孩子入隊列if(head->left) q.emplace(head->left);if(head->right) q.emplace(head->right);}if(flag % 2 == 0)reverse(currentFloorEele.begin(), currentFloorEele.end());ret.emplace_back(currentFloorEele);flag++;}return ret;}
};

3.在每個樹行中找最大值

題目要求返回一個數組,數組的元素都是二叉樹每一層的最大值。

解法:我們只需要在進行層序遍歷的過程中,進行最大值的統計即可。當遍歷完該層后,直接保存最大值即可。

class Solution 
{
public:
vector<int> largestValues(TreeNode* root) {if(root == nullptr) return {};queue<TreeNode*> q;q.emplace(root);vector<int> ret;int currentFloorSize = 0;while(!q.empty()){currentFloorSize = q.size();int maxVal = INT_MIN;while(currentFloorSize--){auto head = q.front();q.pop();maxVal = max(maxVal, head->val);if(head->left) q.emplace(head->left);if(head->right) q.emplace(head->right);}ret.emplace_back(maxVal);}return ret;}
};

?4.二叉樹最大深度

返回所有層中最寬的。其中,我們只需要看每一層的最左和最右即可,其中也要計算中間的空節點。

解法:我們將二叉樹以順序方式進行存儲,存儲對用的根節點以及對應的下標。其實就是堆的存儲方式。當我們根節點從0開始,他的左右孩子可以通過2*x+1,2*x+2得來。這樣下來,每一層的寬度其實就是最左與最右節點的下標的差值+1.

class Solution 
{
public:int widthOfBinaryTree(TreeNode* root) {vector<pair<TreeNode*, unsigned int>> LevelSize; // 模擬隊列,將二叉樹以順序結構存儲unsigned int ret = 0; // 統計結果LevelSize.emplace_back(root, 0);while(!LevelSize.empty()){// 取出該層的首尾節點,并更新結果auto& [x1, y1] = LevelSize[0];auto& [x2, y2] = LevelSize.back();ret = max(ret, y2 - y1 + 1);// 讓孩子入隊vector<pair<TreeNode*, unsigned int>> tmp; // 臨時存儲下一層的節點,最后覆蓋原隊列for(auto& [x, y] : LevelSize){if(x->left) tmp.emplace_back(x->left, y * 2 + 1);if(x->right) tmp.emplace_back(x->right, y * 2 + 2);}// 更新層LevelSize = tmp;}return ret;}
};

說明:我們這里使用數組來模擬的隊列,因為我們讓孩子入隊列后得頭刪上一層的元素,在數組中頭刪消耗比較大,所以我們可以用一個臨時數組來統計下一層的元素,之后用臨時數組覆蓋原數組即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76972.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76972.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76972.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python高級爬蟲之JS逆向+安卓逆向1.1節-搭建Python開發環境

目錄 引言&#xff1a; 1.1.1 為什么要安裝Python? 1.1.2 下載Python解釋器 1.1.3 安裝Python解釋器 1.1.4 測試是否安裝成功 1.1.5 跟大神學高級爬蟲安卓逆向 引言&#xff1a; 大神薯條老師的高級爬蟲安卓逆向教程&#xff1a; 這套爬蟲教程會系統講解爬蟲的初級&…

Windows 安裝和使用 ElasticSearch

SpringBoot3 整合 Elasticsearch 1. ElasticSearch 1.1 ES &#xff08;1&#xff09;ES 是一個開源的分布式搜索和分析引擎&#xff0c;專為處理大模型數據而設計&#xff0c;它能夠實現近乎實時的數據檢索、分析和可視化&#xff0c;廣泛用于全文搜索、日志分析和監控&…

matplotlib初探

庫引入 import matplotlib.pyplot as pltpyplot.figure 創建新圖形或激活現有圖形

NVM 多版本Node.js 管理全指南(Windows系統)

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、全棧領域優質創作者、高級開發工程師、高級信息系統項目管理師、系統架構師&#xff0c;數學與應用數學專業&#xff0c;10年以上多種混合語言開發經驗&#xff0c;從事DICOM醫學影像開發領域多年&#xff0c;熟悉DICOM協議及…

實驗室預約|實驗室預約小程序|基于Java+vue微信小程序的實驗室預約管理系統設計與實現(源碼+數據庫+文檔)

實驗室預約小程序 目錄 基于微信小程序的實驗室預約管理系統設計與實現 一、前言 二、系統功能設計 三、系統實現 1、微信小程序前臺 2、管理員后臺 &#xff08;1&#xff09;管理員登錄 &#xff08;2&#xff09;實驗室管理 &#xff08;3&#xff09;公告信息管理…

SpringBoot底層-數據源自動配置類

SpringBoot默認使用Hikari連接池&#xff0c;當我們想要切換成Druid連接池&#xff0c;底層原理是怎樣呢 SpringBoot默認連接池——Hikari 在spring-boot-autoconfiguration包內有一個DataSourceConfiguraion配置類 abstract class DataSourceConfiguration {Configuration(p…

面試算法高頻03-遞歸

認識遞歸 遞歸的概念與特性&#xff1a;遞歸本質類似循環&#xff0c;是通過函數體進行的循環操作。借助電影《盜夢空間》類比&#xff0c;遞歸如同主角在不同夢境層穿梭&#xff0c;向下進入不同遞歸層&#xff0c;向上能回到原來一層&#xff0c;每一層環境和周圍元素相似&a…

linux Gitkraken 破解

ubuntu 安裝 Gitkraken 9.x Pro 版本_gitcracken.git-CSDN博客

設計模式簡述(十一)裝飾器模式

裝飾器模式 描述基本使用使用 描述 裝飾器模式是一種功能型模式 用于動態增強對象的功能 這么一說感覺上和代理模式有些類似 抽象裝飾器 要實現原有業務接口&#xff0c;并注入原有業務對象 至于對原有業務對象的調用&#xff0c;可以采用private業務對象 實現業務接口方法的…

【NetCore】ControllerBase:ASP.NET Core 中的基石類

ControllerBase:ASP.NET Core 中的基石類 一、什么是 ControllerBase?二、ControllerBase 的主要功能三、ControllerBase 的常用屬性四、ControllerBase 的常用方法2. 模型綁定與驗證3. 依賴注入五、ControllerBase 與 Controller 的區別六、實際開發中的最佳實踐七、總結在 …

DE2-115分秒計數器

一、模塊設計 如若不清楚怎么模塊化&#xff0c;請看https://blog.csdn.net/szyugly/article/details/146379170?spm1001.2014.3001.5501 1.1頂層模塊 module top_counter(input wire CLOCK_50, // 50MHz時鐘input wire KEY0, // 暫停/繼續按鍵out…

ubuntu git cola gui

直接的方法&#xff0c; samba&#xff0c; win 里用 tortoiseSVN 需要先在命令行&#xff0c;運行 git 命令&#xff0c;看到操作提示&#xff0c; 按照提示做 然后右鍵看 git diff 其它的方法 linux下可視化git工具git-cola安裝與使用&#xff08;HTTP方式&#xff09;_git…

每日一題(小白)回溯篇4

深度優先搜索題&#xff1a;找到最長的路徑&#xff0c;計算這樣的路徑有多少條&#xff08;使用回溯&#xff09; 分析題意可以得知&#xff0c;每次向前后左右走一步&#xff0c;直至走完16步就算一條走通路徑。要求條件是不能超出4*4的范圍&#xff0c;不能重復之前的路徑。…

【數據分享】2000—2020年我國250m精度灌溉農田柵格數據(免費獲取)

灌溉農田是指通過水利灌溉為農作物提供必要水分&#xff0c;以維持其生長需求的農田類型。灌溉農田占全球農田的20%&#xff0c;占全球糧食產量的40%。但其消耗了60%-70%的淡水和80%-90%的消耗性用水量。中國是世界上灌溉面積最大的農業大國&#xff0c;但中國僅占世界上8%的農…

MySQL-SQL-DML語句、INSER添加數據、UPDATE更新數據、DELETE刪除數據

一. DML 1. DML的英文全稱是Data Manipulation Language(數據操作語言)&#xff0c;用來對數據庫中表的數據記錄進行增、刪、改操作。 2. 添加數據(INSERT)&#xff1b;修改數據(UPDATE)&#xff1b;刪除數據(DELETE) 二. DML-INSER添加數據 -- DML insert -- 指定字段添加數…

使用SymPy求解矩陣微分方程

引言 在數學、物理、工程等領域,微分方程常常被用來描述系統的變化和動態過程。對于多變量系統或者多方程系統,矩陣微分方程是非常常見的,它可以用來描述如電路、控制系統、振動系統等復雜的動態行為。今天,我們將通過Python 中的 SymPy 庫來求解矩陣微分方程,幫助大家輕…

Sentinel實戰(五)、系統保護規則、限流后統一處理及sentinel持久化配置

Spring Cloud Alibaba-Sentinel實戰(五)、系統保護規則、限流后統一處理及sentinel持久化配置 一、系統保護規則一)、系統規則支持的模式二)、新增系統規則界面三)、demo測試二、限流后統一處理實操demo三、sentinel持久化配一、系統保護規則 系統保護規則是從應用級別的…

【百日精通JAVA | SQL篇 | 第四篇】約束

SQL這一塊沒什么難度&#xff0c;主要是一個熟練度&#xff0c;稍微上點難度的地方&#xff0c;其實在于查&#xff0c;比較復雜&#xff0c;涉及到很多問題。 指定列插入 使用指定列插入的時候&#xff0c;未被指定的列使用默認值進行存儲&#xff0c;默認值為空。 默認值設置…

http協議版本的區別 -- 2和3

目錄 http2和http3的區別 傳輸層協議 QUIC協議 介紹 連接建立與握手 建立安全連接的過程 RTT 建連為什么需要兩個過程 原因 解決 QUIC協議的1-RTT 建連 必要性 連接過程 第一次握手(Client Hello) 版本號 key_share 其他 第二次握手 介紹 Server Hello 身…

21 天 Python 計劃:MySQL 庫相關操作

文章目錄 前言一、系統數據庫1. information_schema2. performance_schema3. mysql4. test 二、創建數據庫1. 語法2. 數據庫命名規則 三、數據庫相關操作1. 查看數據庫2. 選擇數據庫3. 刪除數據庫4. 修改數據庫 總結 前言 Python是一種強大且易于學習的編程語言。通過這個21天的…