【C++算法】72.隊列+寬搜_二叉樹的最大寬度

文章目錄

    • 題目鏈接:
    • 題目描述:
    • 解法
    • C++ 算法代碼:


題目鏈接:

662. 二叉樹最大寬度


題目描述:

096c1cae6feb2a1ea6b7aed3645172a0


解法

這里的寬度指的是一層的最右邊的非空節點到一層的最左邊的非空節點,一共的節點數。

解法一:硬來(會超時,因為可能會有3000個數的左右各1500個節點的最惡心的情況)

仿照之前的層序遍歷,把空節點也加進去。(要注意,遇到空節點要添加兩個空孩子)

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

寬度就是這個隊列的隊尾和隊頭相減再加一。

也可以直接搞一個數組來模擬。

83149bd7a0840080035ca356ddca32bc

36d91dbaca53c224c69a08e3c31c482a

注意細節:下標有可能會溢出。

不過當我們相減之后,即使溢出,結果也是正確的。因為存儲實際上是一個環,所以我們可以使用無符號整數來存儲。


C++ 算法代碼:

/*** Definition for a binary tree node.* 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:int widthOfBinaryTree(TreeNode* root) {// 計算二叉樹最大寬度算法// 基本思路:使用層序遍歷,同時為每個節點分配位置編號// 寬度定義為:每一層最右邊節點與最左邊節點的位置差+1// 使用數組模擬隊列,存儲節點和其位置編號// 使用unsigned int避免大數時可能的整數溢出vector<pair<TreeNode*, unsigned int>> q;q.push_back({root, 1});  // 根節點入隊,位置編號為1unsigned int ret = 0;    // 存儲最大寬度結果while(q.size())  // 只要隊列不為空,就繼續處理{// 計算當前層的寬度:最右節點位置減去最左節點位置再加1auto& [x1, y1] = q[0];       // 當前層最左邊的節點x1及其位置y1auto& [x2, y2] = q.back();   // 當前層最右邊的節點x2及其位置y2ret = max(ret, y2 - y1 + 1); // 更新最大寬度// 準備處理下一層節點vector<pair<TreeNode*, unsigned int>> tmp; // 臨時數組,存儲下一層的節點// 遍歷當前層的所有節點,將其子節點加入到下一層for(auto& [x, y] : q){// 關鍵:為子節點分配位置編號// 左子節點的位置是父節點位置的2倍if(x->left) tmp.push_back({x->left, y * 2});// 右子節點的位置是父節點位置的2倍加1if(x->right) tmp.push_back({x->right, y * 2 + 1});}q = tmp;  // 更新隊列,準備處理下一層}return ret;  // 返回最大寬度}
};

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

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

相關文章

什么是3DVR?VR技術有哪些應用場景?

VR與3D技術解析及應用在高科技領域&#xff0c;VR和3D是兩個常被提及的名詞。那么&#xff0c;這兩者之間究竟存在著怎樣的區別與聯系呢&#xff1f;簡而來說&#xff0c;VR技術是3D技術的一種高級延展和深化應用。3D技術&#xff0c;即將二維設計圖轉化為立體、逼真的視覺效果…

棧與隊列:數據結構核心解密

棧和隊列的基本 棧(Stack)是一種后進先出(LIFO, Last In First Out)的數據結構。元素的插入和刪除操作只能在棧頂進行。常見的操作包括壓棧(push)和彈棧(pop)。 隊列(Queue)是一種先進先出(FIFO, First In First Out)的數據結構。元素的插入在隊尾進行,刪除在隊…

《C++初階之STL》【list容器:詳解 + 實現】

【list容器&#xff1a;詳解 實現】目錄前言------------標準接口介紹------------標準模板庫中的list容器是什么樣的呢&#xff1f;1. 常見的構造2. 迭代器操作std::list::beginstd::list::endstd::list::rbeginstd::list::rend3. 容量的操作std::list::sizestd::list::empty…

【灰度實驗】——圖像預處理(OpenCV)

目錄 1 灰度圖 2 最大值法 3 平均值法 4 加權均值法 5 兩個極端的灰度值 將彩色圖轉為灰度圖地過程稱為灰度化。 灰度圖是單通道圖像&#xff0c;灰度化本質就是將彩色圖的三通道合并成一個通道的過程。三種合并方法&#xff1a;最大值法&#xff0c;平均值法和加權均值法…

【linux驅動開發】編譯linux驅動程序報錯:ERROR: Kernel configuration is invalid.

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄一、報錯二、解決方法1.先編譯linux內核源碼2.再重新編譯驅動程序一、報錯 在編譯驅動程序過程中&#xff0c;經常碰到的一個小問題&#xff1a; make -C /home/lu…

Java面試寶典:MySQL中的鎖

InnoDB中鎖的類型非常多,總體上可以如下分類: 這些鎖都是做什么的?具體含義是什么?我們現在來一一學習。 1. 解決并發事務問題 我們已經知道事務并發執行時可能帶來的各種問題。最大的一個難點是:一方面要最大程度地利用數據庫的并發訪問能力,另一方面又要確保每個用戶…

設備識別最佳實踐:四維交叉驗證框架

設備識別最佳實踐&#xff1a;四維交叉驗證框架 1. MAC地址分析&#xff08;40%權重&#xff09; - 設備身份核驗 核心方法&#xff1a; # MAC地址標準化&#xff08;OUI提取&#xff09; mac"B4:2E:99:FB:9D:78" oui$(echo $mac | tr -d : | cut -c 1-6 | tr a-f A-…

《Java 程序設計》第 9 章 - 內部類、枚舉和注解

大家好&#xff0c;今天我們來學習《Java 程序設計》第 9 章的內容 —— 內部類、枚舉和注解。這三個知識點是 Java 中提升代碼靈活性和可讀性的重要工具&#xff0c;在實際開發中非常常用。接下來我們逐一展開講解&#xff0c;每個知識點都會配上可直接運行的代碼示例&#xf…

CTF Misc入門篇

在CTF比賽中&#xff0c;misc方向是必考的一個方向&#xff0c;其中&#xff0c;圖形隱寫是最最常見的類型。 先從Misc開始入門&#xff0c;一般會借助CTF SHOW解題平臺&#xff0c;解題&#xff0c;然后進行技巧總結。 目錄 圖片篇(基礎操作) misc1 misc2 misc3 misc4 …

Vulnhub 02 Breakout靶機

一、信息收集 我是在僅主機模式下掃描的。 以此去訪問端口。 80端口是上面的主頁&#xff0c;查看一下源代碼&#xff0c;發現了如下圖所示的注釋&#xff0c;翻譯過來是&#xff1a;別擔心&#xff0c;沒有人會來這里&#xff0c;安全地與你分享我的訪問權限&#xff0c;它是…

論文閱讀:2024 arxiv AutoDefense: Multi-Agent LLM Defense against Jailbreak Attacks

總目錄 大模型安全相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 AutoDefense: Multi-Agent LLM Defense against Jailbreak Attacks https://arxiv.org/pdf/2403.04783#page9.14 https://www.doubao.com/chat/14064782214316034 文章目錄…

Spring Boot 請求限流實戰:基于 IP 的高效防刷策略

前言 互聯網流量就像洪水猛獸,來得快去得也快。如果不給接口裝個“限速閥”,服務器瞬間被刷爆,宕機成真,根本不稀奇。沒有限流機制,系統就像沒有剎車的賽車,跑得太快反而翻車。為了保證服務穩定、響應迅速,保護后端資源不被惡意請求掏空,限流成必備武器。 本篇文章將…

機器學習第二課之線性回歸的實戰技巧

1 線性回歸簡介 1 線性回歸應用場景 線性回歸是一種用于分析自變量與連續型因變量之間線性關系的模型&#xff0c;其核心是通過擬合線性方程(y w_1x_1 w_2x_2 ... w_nx_n b&#xff09;來預測因變量或解釋自變量的影響。由于其簡單、可解釋性強的特點&#xff0c;線性回歸…

【時時三省】(C語言基礎)指向指針數據的指針變量

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省在了解了指針數組的基礎上&#xff0c;需要了解指向指針數據的指針變量&#xff0c;簡稱為指向指針的指針。怎樣定義一個指向指針數據的指針變量呢?下面定義一個指向指針數據的指針變量&#…

前端css 的固定布局,流式布局,彈性布局,自適應布局,響應式布局

1. 固定布局容器的寬高是固定的&#xff0c;單位一般是px&#xff0c;不會隨著屏幕大小變化2.流式布局&#xff08;百分比布局/vw&#xff09;vw: 視圖寬度的百分比,1vw代表視窗寬度的1% vh: 視圖高度的百分比,1vh代表視窗高度的1%特點: 寬度隨屏幕大小變化單位用%或vw 高度通常…

python學習DAY26打卡

DAY 26 函數專題1&#xff1a;函數定義與參數 內容&#xff1a; 函數的定義 變量作用域&#xff1a;局部變量和全局變量 函數的參數類型&#xff1a;位置參數、默認參數、不定參數 傳遞參數的手段&#xff1a;關鍵詞參數 傳遞參數的順序&#xff1a;同時出現三種參數類型時…

echarts圖表點擊legend報錯問題(折線圖)

原因是&#xff1a;echats 實例&#xff0c;不能夠用響應式變量去接收。<template><div class"attendance-chart"><div v-if"loading" class"loading">加載中...</div><div v-else-if"error" class"e…

Django模型開發:模型字段、元數據與繼承全方位講解

文章目錄一、模型字段類型詳解Django 與 MySQL 字段類型映射整數類型深度對比二、常用字段選項null 與 blank 的區別注釋與幫助文本默認值設置日期時間特殊選項選項列表&#xff08;choices&#xff09;三、模型元數據與方法模型 Meta 類模型管理器&#xff08;Manager&#xf…

墨者:SQL注入實戰-MySQL

1. 墨者學院&#xff1a;SQL注入實戰-MySQL&#x1f680; 2. 實訓重點目標? 目標一&#xff1a; 了解sqlmap的使用及其tamper插件的使用&#xff1b; 目標二&#xff1a; 了解base64編碼及解碼。 3. 解題方向&#x1f50d; 目標網站的id參數通過Base64編碼傳輸&#xff0c;…

Milvus 實戰全流程

&#x1f4da; 學習路徑總覽1. Milvus 基礎知識什么是向量數據庫&#xff1f;Milvus 的核心概念&#xff08;collection、field、index、partition、segment&#xff09;Milvus 和 Faiss、Annoy、HNSW 的區別2. 安裝與部署Docker 快速部署 Milvus&#xff08;推薦&#xff09;本…