【C++算法】隊列相關經典算法題

1. N叉樹的層序遍歷

首先我們遇到這個題目,沒有任何思路,我們就可以來模擬一下層序的流程,首先我們肯定是訪問根節點1,訪問之后呢就是訪問下一層的最左節點3,此時第一層的節點1已經訪問過了就可以不要了,然后訪問第二層的中間節點2,最后訪問最右邊的節點4,然后就訪問第三層,此時第二層最做節點就不要了,此時我們會發現此時就滿足隊列的先進先出的特點,知道用什么數據結構了我們就直接上思路:

直接上代碼:

class Solution {
public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret; //記錄最終結果queue<Node*> q;  // 層序遍歷需要的隊列if(root == nullptr)return ret;q.push(root); // 隊頭元素入隊while(!q.empty()){vector<int> tmp; //統計本層的節點int size = q.size(); //求出本層元素的個數while(size--){Node* n = q.front();q.pop();tmp.push_back(n->val);for(auto child : n->children) // 讓孩子入隊列{if(child != nullptr)q.push(child);}}ret.push_back(tmp);}return ret;}
};

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

這個題目上給我們說了層序遍歷,那么我們還是要用到隊列,我們會發現,這道題和我們上道題目是一樣的都是層序遍歷,唯一的區別就是偶數層的遍歷方式是我們之前的逆序,所以這道題目也很簡單,直接上思路:

直接來寫代碼:

class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {vector<vector<int>> ret;queue<TreeNode*> q;int flag = 1;//增加一個標記位,讓偶數行的信息逆序即可if(root == nullptr) return ret;q.push(root);while(!q.empty()){vector<int> tmp;int size = q.size(); while(size--){TreeNode* front = q.front();q.pop();tmp.push_back(front->val);if(front->left != nullptr)q.push(front->left);if(front->right != nullptr)q.push(front->right);}if(flag == 1)ret.push_back(tmp);else{reverse(tmp.begin(),tmp.end());ret.push_back(tmp);}  flag *= -1;}return ret;}
};

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

我們這道題和之前的題目思路是一樣的,只不過這個題目我們不需要統計每層的節點,只需要統計最大的哪一個節點即可,所以在層序遍歷過程中,在執?讓下?層節點?隊的時候,我們可以在循環中統計出當前層結點的最大值的,直接上思路:

直接來寫代碼:

class Solution {
public:vector<int> largestValues(TreeNode* root) {vector<int> ret;if(root == nullptr) return ret;queue<TreeNode*> q;q.push(root);while(q.size()) // 如果隊列不為空{int maxnum = INT_MIN;int size = q.size();while(size--){TreeNode* t = q.front();q.pop();maxnum = max(maxnum, t->val); // 記錄每層的最大值if(t->left) q.push(t->left);if(t->right) q.push(t->right);}ret.push_back(maxnum);}return ret;}
};

4.二叉樹的最大寬度

題目解析:

這道題相較于上面三道題就有點難度了,這個題目男難就難在處理空節點,既然統計每一層的最大寬度,我們優先想到的就是利用層序遍歷,把當前層的結點全部存在隊列?面,利用隊列的常度來計算每一層的寬度,統計出最大的寬度。但是,由于空節點也是需要計算在內的。因此,我們可以選擇將空節點也存在隊列??。

?解法一:

這個思路是我們正常會想到的思路,但是極端境況下,最左邊?條長鏈,最右邊?條長鏈,我們需要存幾億個空節點,會超過最?內存限制。

?解法二:利用數組存儲二叉樹的方式,給節點編號

依舊是利?層序遍歷,但是這?次隊列??不單單存結點信息,并且還存儲當前結點如果在數組中存儲所對應的下標(在我們學習數據結構堆的時候,計算左右孩子的方式)。

這樣我們計算每?層寬度的時候,?需考慮空節點,只需將當層結點的左右結點的下標相減再加 1即可,我們直接上思路:?

魔鬼細節:

極端境況下,最左邊?條長鏈,最右邊?條長鏈,我們需要存幾億個空節點,會超過最?內存限制,那么此時我們的編號是2的1500次方,那么肯定會越界,此時無論什么數據類型我們都存不下,但是這個題最后我們是會進行減法的,但是我們數據的存儲是?個環形的結構,并且題?說明,數據的范圍在 int 這個類型的最大值的范圍之內,因此不會超出?圈; 因此,如果是求差值的話,我們?需考慮溢出的情況,由于c++溢出使用int會報錯,因此我們使用unsigned int來存儲這個數據。直接上代碼:

class Solution {
public:int widthOfBinaryTree(TreeNode* root) {queue<pair<TreeNode*, unsigned int>> q;q.push({root,1}); // 根節點和編號入隊unsigned int ret = 0; // 最大寬度while(q.size()){// 先更新這?層的寬度auto& [x1, y1] = q.front();auto& [x2, y2] = q.back();ret = max(ret, y2 - y1 + 1);int size = q.size();// 讓下?層進隊while(size--){auto [a,b] = q.front(); q.pop();if(a->left) q.push({a->left, 2*b});if(a->right) q.push({a->right,2*b+1});}}return ret;}
};

其實這道題我們也可以用數組來實現,但是這時候有人說了此時我們會經常進行刪除節點,而刪除節點都是頭刪,而數組的頭刪效率較低,你咋還使用我們的數組呢?確實是這樣,但是我們進行刪除節點不一定要頭刪,我們可以把本層的節點用tmp統計出來,然后拷貝給q即可。

class Solution {
public:int widthOfBinaryTree(TreeNode* root) {vector<pair<TreeNode*,unsigned int>> q; // 用數組模擬隊列 q.push_back(make_pair(root,1));unsigned int ret = 0;while(!q.empty()){// 先更新這?層的寬度auto& [x1, y1] = q[0];auto& [x2, y2] = q.back();ret = max(ret, y2 - y1 + 1);// 讓下?層進隊vector<pair<TreeNode*, unsigned int>> tmp; // 讓下?層進?這個隊列for(auto [x, y] : q){if(x->left) tmp.push_back({x->left, y * 2});if(x->right) tmp.push_back({x->right, y * 2 + 1});}q = tmp; // 避免了頭刪效率低的問題}return ret;}
};

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

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

相關文章

[GESP樣題 四級] 填幻方和幸運數

B3940 [GESP樣題 四級] 填幻方 題目 在一個NN 的正方形網格中&#xff0c;每個格子分別填上從 1 到 NN 的正整數&#xff0c;使得正方形中任一行、任一列及對角線的幾個數之和都相等&#xff0c;則這種正方形圖案就稱為“幻方”&#xff08;輸出樣例中展示了一個33 的幻方&am…

ICode國際青少年編程競賽- Python-4級訓練場-嵌套for循環練習

ICode國際青少年編程競賽- Python-4級訓練場-嵌套for循環練習 1、 for i in range(3):Spaceship.step(4)for j in range(4):Dev.step(2)Dev.turnRight()Spaceship.turnLeft()Spaceship.step(4)Spaceship.turnRight()2、 for i in range(4):Spaceship.step(6)for j in range(3):…

Nginx或Tengine服務器配置SSL證書

目錄 前提條件 步驟一&#xff1a;下載SSL證書 步驟二&#xff1a;在Nginx服務器安裝證書 步驟三&#xff1a;驗證SSL證書是否配置成功 前提條件 已通過數字證書管理服務控制臺簽發證書SSL證書綁定的域名已完成DNS解析&#xff0c;即您的域名與主機IP地址相互映射已在Web服…

維修Philips IU22飛利浦四維多普勒彩超診斷儀 V6-2 L12-5 C8-4V深圳捷達工控維修

專為新時代而設計。專為更多而設計。 超聲波在抗擊 COVID-19 中的成像作用不斷擴大&#xff0c;并且對血管和心臟檢查的需求不斷增加&#xff0c;因此比以往任何時候都更有價值。飛利浦的超聲產品組合&#xff08;包括 EPIQ Elite&#xff09;為一線護理人員提供了寶貴的診斷支…

Intel處理器7z/XZ遇到 The failure in hardware

最近在使用Intel 12700H混合架構處理器的時候&#xff0c;一旦使用7z或者XZ算法壓縮東西就會出現如下的報錯&#xff1a; Internal Error: The failure in hardware (RAM or CPU), OS or program在檢查排除了內存、磁盤和OS的問題后&#xff0c;最終確定為Intel CPU的問題&…

Lazada、Shopee測評自養號,快速出單技巧全解析!

每個人都憧憬著自己的店鋪能夠擁有一款或多款引人注目的熱銷商品&#xff0c;這些商品不僅能為店鋪帶來可觀的收益&#xff0c;更重要的是它們能夠成為吸引顧客的強大磁石&#xff0c;顯著提升店鋪的整體流量。一旦這樣的爆款商品成功吸引顧客&#xff0c;其他產品也將隨之受到…

C++11:并發新紀元 —— 深入理解異步編程的力量(1)

hello &#xff01;大家好呀&#xff01; 歡迎大家來到我的Linux高性能服務器編程系列之《C11&#xff1a;并發新紀元 —— 深入理解異步編程的力量》&#xff0c;在這篇文章中&#xff0c;你將會學習到C新特性以及異步編程的好處&#xff0c;以及其如何帶來的高性能的魅力&…

Python:通過接口獲取公眾號的文章列表(但是開發文檔沒有這個接口)

&#x1f4da;博客主頁&#xff1a;knighthood2001 ?公眾號&#xff1a;認知up吧 &#xff08;目前正在帶領大家一起提升認知&#xff0c;感興趣可以來圍觀一下&#xff09; &#x1f383;知識星球&#xff1a;【認知up吧|成長|副業】介紹 ??感謝大家點贊&#x1f44d;&…

【LeetCode】每日一題:2960. 統計已測試設備

給你一個長度為 n 、下標從 0 開始的整數數組 batteryPercentages &#xff0c;表示 n 個設備的電池百分比。 你的任務是按照順序測試每個設備 i&#xff0c;執行以下測試操作&#xff1a; 如果 batteryPercentages[i] 大于 0&#xff1a; 增加 已測試設備的計數。 將下標在 [i…

力扣HOT100 - 35. 搜索插入位置

解題思路&#xff1a; 二分法模板 class Solution {public int searchInsert(int[] nums, int target) {int left 0;int right nums.length - 1;while (left < right) {int mid left ((right - left) >> 1);if (nums[mid] target)return mid;else if (nums[mid…

【qt】設計器實現界面

設計器實現界面 一.總體思路二.具體操作1.創建項目2.粗略拖放3.水平布局4.垂直布局5.修改名字6.轉到槽7.實現槽函數 一.總體思路 二.具體操作 1.創建項目 這次咱們一定要勾選Generate form哦。 因為我們要使用設計器進行拖放。 2.粗略拖放 這里用到了復選框&#xff1a;C…

[數據集][目標檢測]管道焊縫質量檢測數據集VOC+YOLO格式1134張2類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;1134 標注數量(xml文件個數)&#xff1a;1134 標注數量(txt文件個數)&#xff1a;1134 標注…

python元類與C#、Java中的反射

Python的元類和C#中的反射 在概念上有一定的相似性&#xff0c;但它們的目的和使用方式有所不同。 Python的元類&#xff1a; 元類&#xff08;Metaclass&#xff09;是控制類創建的類。它們定義了類的創建過程&#xff0c;可以修改類的行為。元類通過定制類的創建過程&…

算法訓練營第二十五天 | LeetCode 669 修剪二叉樹、

LeetCode 669 修剪二叉樹 這題用層序遍歷雙指針刪除不符合條件的節點即可。具體是要用到一個虛擬根節點&#xff0c;雙指針中prev指針每次指向隊列頂元素&#xff0c;cur指針先指向prev左子節點&#xff0c;用循環去除這個位置上不符合條件的節點并連上繼承節點&#xff0c;內…

“我們堅持開源!”阿里云發布“地表最強”中文大模型:半年一迭代、性能翻倍?

5 月 9 日&#xff0c;在通義大模型發布一周年之際&#xff0c;阿里云大模型生態迎來一次重大升級&#xff0c;主要有“四個最”&#xff1a; 通義千問 2.5 正式發布&#xff0c;“模型性能全面趕超 GPT-4 Turbo&#xff0c;成為地表最強中文大模型”&#xff1b;Qwen1.5-110B…

卷積特征圖與感受野

特征圖尺寸和感受野是卷積神經網絡中非常重要的兩個概念&#xff0c;今天來看一下&#xff0c;如何計算特征尺寸和感受野。 特征圖尺寸 卷積特征圖&#xff0c;是圖片經過卷積核處理之后的尺寸。計算輸出特征的尺寸&#xff0c;需要給出卷積核的相關參數包括&#xff1a; 輸…

PC端與bluetooth藍牙虛擬串口通信

應該采用RFCOMM虛擬串口方式來進行通信&#xff0c;原理跟socket通信類似&#xff0c;不同的是使用的通信協議不同&#xff0c;本人結合相關的API&#xff0c;做了以下最簡單的封裝。 1、獲取本地藍牙設備與附近藍牙設備信息 2、通信類 /* 通信類&#xff1a;只是對于客戶端通…

基于Python實現單例模式

目錄 1、使用裝飾器實現 2、使用__new__方法實現 單例模式是一種設計模式&#xff0c;它確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來訪問這個唯一實例。這種模式在多種場景中都非常有用&#xff0c;以下是單例模式的一些常見應用場景&#xff1a; 應用程序的…

Spring線程池有哪些

目錄 SimpleAsyncTaskExecutor SyncTaskExecutor ThreadPoolTaskExecutor ThreadPoolTaskScheduler Spring框架提供了多種線程池類型,以滿足不同場景下的需求。以下是一些常見的Spring線程池類型: SimpleAsyncTaskExecutor 這個實現不重用任何線程,每次調用都會啟動一…

抽空學學go

2024年5月9日11:14:24 學習go 看課8小時轉職Golang工程師(如果你想低成本學習Go語言)_嗶哩嗶哩_bilibili 文檔[8小時轉職Golang工程師 (yuque.com)]( 1.安裝go 2024年5月9日11:27:16 2.安裝 vscode go配置環境 vs code配置go開發環境 (zhihu.com) vscode里面配置代理&…