力扣刷題第二十八天--二叉樹

前言

今天的五道題都是層序遍歷的模板,深度優先的遞歸還不太熟。繼續努力。

內容

一、在每個樹行中找最大值

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

給定一棵二叉樹的根節點?root?,請找出該二叉樹中每一層的最大值。

廣度優先搜素

時間復雜度:O(n),其中 nnn 為二叉樹節點個數,每一個節點僅會進出隊列一次。

空間復雜度:O(n),存儲二叉樹節點的空間開銷。

func largestValues(root *TreeNode) []int {var res []intif root==nil{return res}//沒有這個會panic: runtime error: invalid memory address or nil pointer dereference  curLevel:=[]*TreeNode{root}for len(curLevel)>0{nextLevel:=[]*TreeNode{}maxVal:=math.MinInt32for _,node:=range curLevel{maxVal= Max(maxVal,node.Val)if node.Left!=nil{nextLevel=append(nextLevel,node.Left)}if node.Right!=nil{nextLevel=append(nextLevel,node.Right)}}res=append(res,maxVal)curLevel=nextLevel}return res
}func Max(a,b int)int{if a>b{return a}else{return b}
}
深度優先搜索

時間復雜度:O(n),其中 nnn 為二叉樹節點個數。二叉樹的遍歷中每個節點會被訪問一次且只會被訪問一次。

空間復雜度:O(height)。其中 height 表示二叉樹的高度。遞歸函數需要棧空間,而棧空間取決于遞歸的深度,因此空間復雜度等價于二叉樹的高度。

func largestValues(root *TreeNode)(ans []int){var dfs func(*TreeNode,int)dfs=func(node *TreeNode,height int){if node==nil{return}if height==len(ans){ans=append(ans,node.Val)}else{ans[height]=max(ans[height],node.Val)}dfs(node.Left,height+1)dfs(node.Right,height+1)}dfs(root,0)return
}
func max(a,b int)int{if a>b{return a}else{return b}
}
二、填充每個節點的下一個右側節點指針

116.填充每個節點的下一個右側節點指針

給定一個?完美二叉樹?,其所有葉子節點都在同一層,每個父節點都有兩個子節點。二叉樹定義如下:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每個 next 指針,讓這個指針指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指針設置為?NULL

初始狀態下,所有?next 指針都被設置為?NULL

廣度優先搜素
/*** Definition for a Node.* type Node struct {*     Val int*     Left *Node*     Right *Node*     Next *Node* }*/func connect(root *Node) *Node {if root==nil{return root}curLevel:=[]*Node{root}for len(curLevel)>0{temp:=curLevelcurLevel=nilfor i,node:=range temp{if i+1<len(temp){node.Next=temp[i+1]}if node.Left!=nil{curLevel=append(curLevel,node.Left)}if node.Right!=nil{curLevel=append(curLevel,node.Right)}}}return root
}
使用已建立的next 指針?

時間復雜度:O(N),每個節點只訪問一次。

空間復雜度:O(1),不需要存儲額外的節點。

func connect(root *Node)*Node{if root==nil{return root}// 每次循環從該層的最左側節點開始for leftmost:=root;leftmost.Left!=nil;leftmost=leftmost.Left{// 通過 Next 遍歷這一層節點,為下一層的節點更新 Next 指針for node:=leftmost;node!=nil;node=node.Next{// 左節點指向右節點node.Left.Next=node.Rightif node.Next!=nil{// 右節點指向下一個左節點node.Right.Next=node.Next.Left}}}return root
}
三、填充每個節點的下一個右側節點指針II

117.填充每個節點的下一個右側節點指針II

給定一個二叉樹:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每個 next 指針,讓這個指針指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指針設置為?NULL?。

初始狀態下,所有?next 指針都被設置為?NULL?。

廣度優先搜素

一模一樣的代碼 注意curLevel和temp 不要寫混了

func connect(root *Node) *Node {if root==nil{return root}curLevel:=[]*Node{root}for len(curLevel)>0{temp:=curLevelcurLevel=nilfor i,node:=range temp{if i+1<len(temp){node.Next=temp[i+1]}if node.Left!=nil{curLevel=append(curLevel,node.Left)}if node.Right!=nil{curLevel=append(curLevel,node.Right)}}}return root
}
四、二叉樹的最大深度

104.二叉樹的最大深度

給定一個二叉樹?root?,返回其最大深度。

二叉樹的?最大深度?是指從根節點到最遠葉子節點的最長路徑上的節點數。

廣度優先搜素
func maxDepth(root *TreeNode) int {var ans intif root==nil{return ans}curLevel:=[]*TreeNode{root}for len(curLevel)>0{temp:=curLevelcurLevel=nilfor _,node:=range temp{if node.Left!=nil{ curLevel=append(curLevel,node.Left)}if node.Right!=nil{curLevel=append(curLevel,node.Right)}}ans++//記錄深度,其他的是層序遍歷的板子}return ans
}
深度優先搜索
func maxDepth(root *TreeNode)int{if root==nil{return 0}return max(maxDepth(root.Left),maxDepth(root.Right))+1
}
func max(a,b int)int{if a>b{return a}return b
}
五、二叉樹的最小深度

111.二叉樹的最小深度

給定一個二叉樹,找出其最小深度。

最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。

說明:葉子節點是指沒有子節點的節點。

廣度優先搜素
func minDepth(root *TreeNode) int {var ans intif root==nil{return ans}curLevel:=[]*TreeNode{root}for len(curLevel)>0{temp:=curLevelcurLevel=nilfor _,node:=range temp{if node.Left==nil&&node.Right==nil{return ans+1}if node.Left!=nil{ curLevel=append(curLevel,node.Left)}if node.Right!=nil{curLevel=append(curLevel,node.Right)}}ans++}return ans
}
深度優先搜索
func minDepth(root *TreeNode)int{if root==nil{return 0}if root.Left==nil&&root.Right==nil{return 1}minD:=math.MaxInt32if root.Left!=nil{minD=min(minD,minDepth(root.Left))}if root.Right!=nil{minD=min(minD,minDepth(root.Right))}return minD+1
}func min(a,b int)int{if a<b{return a}return b
}

最后

即使感知自己身體的需求,不管是體力消耗還是腦力消耗,及時補充能量,吃飯,休息。

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

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

相關文章

算法基礎:KMP算法詳細詳解

目錄 1、幾個最基本的概念 2、暴力算法 3、KMP算法 4、KMP代碼實現 5、時間復雜度 1、幾個最基本的概念 字符串的前綴&#xff1a; 主串&#xff08;目標串&#xff09;從索引0開始的子串被稱為主串的前綴。 字符串的后綴&#xff1a; 主串從索引大于0的位置到結尾的子串…

【人工智能入門學習資料福利】

總目錄如下&#xff08;部分截取&#xff09;&#xff1a; 百度網盤鏈接&#xff1a;https://pan.baidu.com/s/1bfDVG-xcPR3f3nfBJXxqQQ?pwdifu6 提取碼&#xff1a; ifu6

Sentinel在Spring Cloud中的流量控制與熔斷降級:保障你的微服務穩定運行

在當今高度互聯的世界中&#xff0c;微服務架構已成為構建穩健系統的基石。然而&#xff0c;隨著系統復雜性的增加&#xff0c;高并發和異常情況下&#xff0c;保障服務穩定性變得尤為關鍵。本文將帶你探索Spring Cloud中Sentinel框架的強大功能&#xff0c;它能夠為你的微服務…

協程及運用

協程 使用方法一方法二網頁下載中使用有返回值 實戰圖片實戰 一個線程多個任務&#xff0c;線程由操作系統開啟&#xff0c;比較耗資源。線程內合理分配任務&#xff0c;充分利用線程內的資源&#xff0c;一個任務io阻塞時&#xff0c;cpu處理其他非阻塞任務。 使用 方法一 i…

B站已經部分上線前臺實名,如不同意實名,后期賬號流量將收影響!

B站部分百萬粉絲博主的主頁顯示賬號運營人名字的政策是從10月31日開始的。當天&#xff0c;B站官方發布了《嗶哩嗶哩關于頭部“自媒體”賬號前臺實名的公告》&#xff0c;表明了其前臺實名制的實施計劃。 B站部分上線前臺實名的過程可以追溯到2021年。當時&#xff0c;中國政府…

window下殺指定端口進程

netstat -ano | findstr "8762" taskkill /pid 14992 /f

【LeetCode】144. 二叉樹的前序遍歷

144. 二叉樹的前序遍歷 難度&#xff1a;簡單 題目 給你二叉樹的根節點 root &#xff0c;返回它節點值的 前序 遍歷。 示例 1&#xff1a; 輸入&#xff1a;root [1,null,2,3] 輸出&#xff1a;[1,2,3]示例 2&#xff1a; 輸入&#xff1a;root [] 輸出&#xff1a;[]…

ARM裸機-18(SD卡啟動)

1、主流的外存設備介紹 內存和外存的區別&#xff1a;一般是把這種RAM(random access memory&#xff0c;隨機訪問存儲器&#xff0c;特點是任意字節讀寫&#xff0c;掉電丟失)叫內存&#xff0c;把ROM (read only memory&#xff0c;只讀存儲器&#xff0c;類似于Flash、SD卡之…

如何解決安卓手機無法預覽pdf文件而是需要直接下載的問題

在開發中常常會遇到需要在一個應用里打開一份pdf文件并預覽&#xff0c;經真機調試時發現在蘋果手機上打開pdf文件能正常預覽&#xff0c;但在安卓手機打開時卻會需要我們下載才能預覽&#xff0c;無法直接預覽 為了解決這個問題&#xff0c;我們采用安裝pdfH5插件的方式&…

計算機三級嵌入式知識總結(一)

一、ARM的七種異常類型 1、復位異常RESET “復位異常RESET”通常是指在電子設備或系統中發生了一個意外的復位或重啟。這可能是由于硬件故障、軟件問題或其他未知的原因引起的。當設備經歷復位異常時&#xff0c;它可能會丟失正在進行的操作或設置&#xff0c;導致數據丟失或系…

LINUXZ

10.6.2 AT24C02 訪問方法 設備地址 從芯片手冊上可以知道&#xff0c;AT24C02 的設備地址跟它的 A2、A1、A0 引腳有關&#xff1a; 圖 10.36 AT24C02 設備地址引腳配置 294 / 577 打開 I2C 模塊的原理圖&#xff1a; 開發板配套網盤資料\04_開發板原理圖\ 04_Extend_modules\通…

SQL語句執行過程

一條 SQL 的執行過程可以大致分為以下幾個步驟&#xff1a; 連接器&#xff1a; ○ 客戶端與數據庫建立連接&#xff0c;并發送 SQL 語句給數據庫服務。 ○ 連接器驗證客戶端的身份和權限&#xff0c;確保用戶有足夠的權限執行該 SQL 語句。查詢緩存&#xff1a; ○ 連接器首先…

基于鷹棲息算法優化概率神經網絡PNN的分類預測 - 附代碼

基于鷹棲息算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于鷹棲息算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于鷹棲息優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xff1a;針對PNN神經網絡…

Motion v5.6.7 蘋果電腦上的視頻編輯

Motion mac是一款運行在蘋果電腦上的視頻編輯軟件&#xff0c;它能讓您自定Final Cut Pro字幕、轉場和效果。 它可以在2D或3D空間中創建您自己的精美炫目的動畫&#xff0c;同時還能在您工作時提供實時反饋。廣色域支持讓你的動態圖形更顯出色光彩。3D文字功能經過優化增強&am…

01背包與完全背包學習總結

背包問題分類見下圖 參考學習點擊&#xff1a;代碼隨想錄01背包講解 01背包問題&#xff1a; 核心思路&#xff1a; 1、先遍歷物品個數&#xff0c;再遍歷背包容量。因為容量最先是最大的&#xff0c;往背包里放物品&#xff0c;所以背包容量在慢慢減少&#xff0c;但背包容量…

CentOS7 firewall使用(開放和禁止端口、端口轉發)

安裝 安裝命令 yum install firewalld -y 使用命令 systemctl start firewalld ##開啟防火墻systemctl stop firewalld ##關閉防火墻systemctl status firewalld ##查看防火墻狀態firewall-cmd --reload ##重啟防火墻systemctl enable firewalld ##設置開啟啟動systemctl …

共享內存原理介紹及簡單使用

每當我們執行一個程序時&#xff0c;對于操作系統來講就創建了一個進程,在這個過程中&#xff0c;伴隨著資源的分配和釋放。可以認為進程是一個程序的一次執行過程。進程的內存空間是相互獨立的&#xff0c;一般而言是不能相互訪問的。但很多情況下進程間需要互相通信&#xff…

上海泗博MODBUS轉PROFINET網關TS-180 網關連接LED顯示屏應用案例

項目 常州某鋼鐵公司的軋鋼車間為了更清晰地顯示當天軋鋼系統各環節的工作參數&#xff0c;如軋鋼的日期、鋼種、吐絲機設備運行情況等&#xff0c;引進了另一家為其定制的LED顯示屏。軋鋼系統各環節的設備參數通過西門子S7-1500PLC采集后&#xff0c;實時顯示在LED顯示屏上&am…

飛瓜數據B站丨B站UP主11月第3周榜單排行榜榜單(B站平臺)發布!

飛瓜輕數發布2023年11月13日-11月19日飛瓜數據UP主排行榜&#xff08;B站平臺&#xff09;&#xff0c;通過充電數、漲粉數、成長指數、帶貨數據等維度來體現UP主賬號成長的情況&#xff0c;為用戶提供B站號綜合價值的數據參考&#xff0c;根據UP主成長情況用戶能夠快速找到運營…

Linux網絡——傳輸層

目錄 一.再談端口概念 二.UDP協議 1.UDP協議格式 2.UDP的特點 3.面向數據報 4.UDP的緩沖區 5.UDP使用注意事項 6.UDP協議在內核中的表現形式 7.基于UDP的應用層協議 三.TCP協議 1.TCP協議格式 2.TCP確認應答機制 3.超時重傳機制 4.TCP報文六位標志位 5.滑動窗口 6…