每日一題:LeetCode-102.二叉樹的層序遍歷

每日一題系列(day 03)

前言:

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈

?? 🔎🔎如果說代碼有靈魂,那么它的靈魂一定是👉👉算法👈👈,因此,想要寫出💚優美的程序💚,核心算法是必不可少的,少年,你渴望力量嗎😆😆,想掌握程序的靈魂嗎???那么就必須踏上這樣一條漫長的道路🏇🏇,我們要做的,就是斬妖除魔💥💥,打怪升級!💪💪當然切記不可😈走火入魔😈,每日打怪,日日累積,終能成圣🙏🙏!開啟我們今天的斬妖之旅吧!????

LeetCode-102.二叉樹的層序遍歷

題目:

給你二叉樹的根節點 root ,返回其節點值的 層序遍歷 。 (即逐層地,從左到右訪問所有節點)。

示例1:

在這里插入圖片描述

示例2:

在這里插入圖片描述

注意事項:

  • 樹中節點數目在范圍 [0, 2000] 內
  • -1000 <= Node.val <= 1000

解法一:

??思路:

??說到二叉樹的層序遍歷,我們第一反應肯定是用廣度優先搜索,廣搜需要隊列存儲每一層的節點,當一層節點處理完之后再將本層已處理的節點全部pop掉,接著處理下一層節點,直到處理完畢,深搜便完成了,這里題目要求用二維數組來接收深搜的結果,所以我們可以開個二維數組,在每層節點pop之前,把每層節點記錄在一位數組中,最終把一維數組放到二維數組中。每一層的二維數組都代表每一層的節點的遍歷結果。

??1、首先,當節點為空的時候我們直接返回空的二維數組。不為空則根據題目要求創建一個二維數組,再創建隊列來記錄二叉樹的每個節點,再將根節點壓入到隊列中。
??2、節點已經入隊,開始處理二叉樹。我們知道,二叉樹有很多層,所以我們需要一層一層來遍歷,每一層處理完后,本層節點也被pop,再處理下一層,其實這就是一個循環的過程。條件是只要不為空就一直處理。
??3、在循環內,創建一個臨時一維數組來記錄本層所有節點的值,用計數器來記錄這層擁有的節點個數,再使用for循環處理每一層的節點。
??4、for循環內,取隊頭元素,將隊頭的元素值壓入本層的一維數組中,當處理的當前節點時,如果當前節點有子節點,就把下一層的子節點入隊,用來下次的遍歷,最后再將當前已經處理完了的節點pop出隊列。
??5、最后直接返回二維數組即可。

代碼實現:

/*** 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:vector<vector<int>> levelOrder(TreeNode* root) {if(root == NULL)vector<vector<int>> ans;//根據題目要求創建一個二維數組return vector<vector<int>>();//節點為空直接返回空的二維數組即可queue<TreeNode *> q;//創建一個隊列用來記錄每一層的節點TreeNode *node = nullptr;//記錄隊列的每個節點,便于處理單個節點q.push(root);//將根節點壓入隊列while(!q.empty())//只要隊列不為空說明這一層還存在節點{int cnt = q.size();//記錄隊列節點數量vector<int> tmp;//使用tmp數組接收每一層的節點for(int i = 0 ; i < cnt ; i++)//處理每層的節點{node = q.front();//記錄取隊頭節點tmp.push_back(node -> val);//在隊列這層節點pop之前將節點值壓入本層的一維數組,這個一維數組就是這層節點if(node -> left) q.push(node -> left);//本層節點的左子樹存在就把左孩子入隊列,下次處理if(node -> right) q.push(node -> right);//本層節點的右子樹存在就把右孩子入隊列,下次處理q.pop();//本層節點處理完,把本層pop掉,處理下一層節點}ans.push_back(tmp);//將一維數組(本層遍歷結果)尾插進二維數組}return ans;//返回二維數組即可}
};

解法二:

??思路:

??其實這題完全可以不用廣搜,使用深搜也能進行層序遍歷,并且使用深搜的代碼會更加簡潔一些。使用深搜也就是dfs,那么如何深搜才是關鍵,其實我們只需要知道每個節點的層數就可以進行深搜了,我們可以直接用節點的層數把深搜的每個節點壓入到對應層的數組中。

??1、在深度優先搜索前,我們按照題目要求先創建一個二維數組,然后進行深搜,這里需要注意,dfs的參數首先要傳入根節點,在傳入從哪層開始處理的層次(從第0層開始處理),最后再傳參二維數組的引用。
??2、進入到深搜,如果節點為空的話直接返回。當本層層數與二維數組存儲的一維數組數量相等,表示已經處理到當前的層數了,這個時候在二維數組當前層數(下標)插入一個空一維數組。
??3、接下來就將每一層的節點插入到對應層的一維數組中,然后向左子樹搜索,左子樹為當前層的下一層,所以傳參k + 1,然后向右子樹搜索,同樣層數為k + 1,最后return即可。

在這里插入圖片描述

代碼實現:

/*** 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:void dfs(TreeNode *root, int k, vector<vector<int>> &ans)//傳參需要根節點,節點所在層數,以及二維數組的引用傳參{if(root == NULL) return;//根節點為null直接返回if(k == ans.size()) ans.push_back(vector<int>());//當當前層數與二維數組存儲一維數組數量相同時,表示處理到當前的層數了,對二維數組進行尾插一個空一維數組ans[k].push_back(root -> val);//將每一層的節點尾插到每一層的數組里dfs(root -> left,  k + 1, ans);//深搜左子樹,下一層節點層數要加一dfs(root -> right, k + 1, ans);//同樣,深搜下一層右子樹,層數加一return;//深搜結束}vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> ans;//創建二維數組dfs(root, 0, ans);//進行深搜return ans;//返回深搜結果即可}
};

??二叉樹的層序遍歷,我們通常是使用第一種隊列的方式進行廣度優先搜索,然而用深度優先搜索來對二叉樹層序遍歷的代碼設計感更優美,可讀性也更高。

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

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

相關文章

NX二次開發UF_CSYS_set_wcs 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_set_wcs Defined in: uf_csys.h int UF_CSYS_set_wcs(tag_t csys_id ) overview 概述 Sets the work coordinate system to the prototype coordinate system whose tag y…

為什么技術干不過產品?

近年來&#xff0c;我們經常會聽到一些關于技術和產品之間關系的討論&#xff0c;包括最近的ChatGPT之父奧特曼被董事會開除事件。在這個問題上&#xff0c;有人認為技術應該優于產品&#xff0c;因為技術是實現產品的基礎。然而&#xff0c;也有人認為產品比技術更重要&#x…

基于低代碼平臺搭建應用程序

目錄 一、背景 二、如何基于低代碼開發應用&#xff1f; 1.創建數據表 2.添加數據表屬性 3.配置功能 4.數據篩選 5.數據集顯示&功能發布 三、寫在最后 一、背景 很多時候&#xff0c;市場上的管理軟件魚龍混雜&#xff0c;找一些外包團隊在實際應用中效果并不理想&#xff…

企業微信平臺:連接你我,引領數字化未來

近年來&#xff0c;隨著移動互聯網的飛速發展&#xff0c;社交媒體平臺如微信已經成為人們生活中必不可少的一部分。對于企業而言&#xff0c;微信平臺不僅是一個重要的宣傳渠道&#xff0c;更是實現數字化轉型的關鍵工具。本文將探討企業微信平臺的發展趨勢、運營策略以及成功…

開源還是閉源(=°Д°=)!!趨勢表明,開源技術在諸多領域中日益受到重視

開源和閉源&#xff0c;兩種截然不同的開發模式&#xff0c;對于大模型的發展有著重要影響。開源讓技術共享&#xff0c;吸引了眾多人才加入&#xff0c;推動了大模的創新。而閉源則保護了商業利益和技術優勢&#xff0c;為大模型的商業應用提供了更好的保障。 一、開源和閉源的…

堆和前綴樹

1 堆 1.1 堆結構 堆是用數組實現的完全二叉樹結構完全二叉樹中如果每棵樹的最大值都在頂部就是大根堆&#xff0c;最小值在頂部就是小根堆堆結構的heapInsert就是插入操作&#xff0c;heapify是取出數組后進行堆結構調整的操作優先級隊列結構就是堆結構 public class Heap {…

通過ros系統中websocket中發送sensor_msgs::Image數據給web端顯示(三)

通過ros系統中websocket中發送sensor_msgs::Image數據給web端顯示(三) 不使用base64編碼方式傳遞 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filter…

【正點原子STM32連載】第五十九章 T9拼音輸入法實驗(Julia分形)實驗 摘自【正點原子】APM32F407最小系統板使用指南

1&#xff09;實驗平臺&#xff1a;正點原子APM32F407最小系統板 2&#xff09;平臺購買地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套實驗源碼手冊視頻下載地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第五十…

關于 token 和證書

關于 token 和證書 在網絡檢測中&#xff0c;Token通常是指一種特殊的令牌&#xff0c;用于在分布式系統中進行資源控制和訪問管理。Token可以用于驗證客戶端的身份、限制客戶端的訪問權限以及控制客戶端對某些資源的使用。 在網絡檢測中&#xff0c;Token通常用于以下幾個方…

uniapp IOS從打包到上架流程(詳細簡單) 原創

? 1.登入蘋果開發者網站&#xff0c;打開App Store Connect ? 2.新App的創建 點擊我的App可以進入App管理界面&#xff0c;在右上角點擊?新建App 即可創建新的App&#xff0c;如下圖&#xff1a; ? 3.app基本信息填寫 新建完App后&#xff0c;需要填寫App的基本信息&…

SOLIDWORKS 2024新功能之CAM篇

SOLIDWORKS 2024 新功能 CAM篇目錄概述 ? 附加探測周期參數 ? 反轉切割的固定循環螺紋加工 ? 包含裝配體的零件的正確進給/速度數據 ? Heidenhain 探測類型 ? 2.5 軸特征向導中島嶼的終止條件 ? 鏈接輪廓銑削操作的切入引導和切出引導參數 ? 螺紋銑削操作的最小孔…

網絡工程師眼中的網站安全:應對攻擊的綜合措施

作為一名專業的網絡工程師&#xff0c;我們深知網站面臨各種攻擊威脅的現實。在構建網站安全的同時&#xff0c;綜合運用技術手段和管理策略是至關重要的。在這篇文章中&#xff0c;我們將從網絡工程師的視角出發&#xff0c;介紹如何解決網站被攻擊的問題&#xff0c;并在其中…

飛凌嵌入式受邀參加「2023年電子工程師大會」并做主旨演講

11月23日&#xff0c;華秋電子發燒友在深圳總部舉辦了「2023年電子工程師大會暨第三屆社區年度頒獎」活動&#xff0c;邀請到了高校教授、企業創始人及高管、行業技術專家、電子工程師等眾多嘉賓到場&#xff0c;呈現并傳播了電子產業動態、最新技術、應用案例及開源硬件項目。…

C#FlaUI.UIA實現發送微信消息原理

一 準備 .NetFramework 4.8 FlaUI.UIA3 4.0.0 FlaUInspect V1.3.0 1下載FlaUInspect https://github.com/FlaUI/FlaUInspect FlaUInspect V1.3.0 百度網盤下載 2 NuGet 引用 flaUI.UIA3 4.0.0 二代碼部分 1 引用FlaUI using FlaUI.Core; using FlaUI.Core.Automatio…

安防系統智能視頻監控中出現畫面異常該如何自檢?

大家都知道&#xff0c;在當今社會&#xff0c;攝像頭無處不在&#xff0c;除了常見的生活與工作場景中&#xff0c;在一些無法人員無法長期駐點場景&#xff0c;如野生動物監測、高空作業監控、高壓電纜監控等場景&#xff0c;在這些地方安裝攝像頭就是為方便日常監控。但是由…

Odoo:行業領先的免費開源生產制造管理系統

產品生命周期管理 用 Odoo 產品數據管理解決方案加速產品開發 研究、開發和設計新產品或者重新設計現有產品是所有制造企業的活力之源&#xff0c;但很多企業的設計部門和工程部門卻完全脫離 ERP 系統。這導致工程師需要耗費大量時間來回答企業中其他部門就產品狀態、修改級別…

遞歸和動態規劃的區別

時間復雜度方面&#xff1a; 遞歸會導致指數級別的時間復雜度&#xff0c;因為它會計算許多重復的子問題。 動態規劃會存儲子問題的結果&#xff0c;來降低復雜度&#xff0c;使其變成多項式級別。 自頂向下VS自底向上 遞歸采用自頂向下的方式&#xff0c;從原問題出發&#xf…

Course1-Week2-多輸入變量的回歸問題

Course1-Week2-多輸入變量的回歸問題 文章目錄 Course1-Week2-多輸入變量的回歸問題1. 向量化和多元線性回歸1.1 多維特征1.2 向量化1.3 用于多元線性回歸的梯度下降法 2. 使梯度下降法更快收斂的技巧2.1 特征縮放2.2 判斷梯度下降是否收斂2.3 如何設置學習率 3. 特征工程3.1 選…

看圖說話:對臟讀、不可重復度、幻讀進行總結

1、臟讀 「事務B」將 id 為 1 的用戶 name 修改為“小卡”&#xff0c;事務未提交。「事務A」查詢 id 為 1 的用戶數據&#xff0c;此時 name 已為“小卡”。 2、不可重復度 「事務A」第一次讀取 id 為 1 的用戶&#xff0c;name 是 “卡卡”。「事務B」將 id 為 1 的用戶 nam…

Sectigo

隨著互聯網的普及和技術的飛速發展&#xff0c;網絡安全問題引起重視。這時&#xff0c;有一家名為Sectigo(原Comodo CA)的公司應運而生&#xff0c;致力于為企業和個人提供最先進、最可靠的網絡安全解決方案。 Sectigo(原Comodo CA) 成立于2008年&#xff0c;總部位于美國加利…