【LeetCode每日一題】226. 翻轉二叉樹 101. 對稱二叉樹

每日一題

  • 226. 翻轉二叉樹
    • 題目
    • 總體思路
    • 代碼
  • 101. 對稱二叉樹
    • 題目
    • 總體思路
    • 代碼
    • 知識點

2025.9.5

226. 翻轉二叉樹

題目

給你一棵二叉樹的根節點 root ,翻轉這棵二叉樹,并返回其根節點。

示例 1:
在這里插入圖片描述
輸入:root = [4,2,7,1,3,6,9]
輸出:[4,7,2,9,6,3,1]

示例 2:
在這里插入圖片描述
輸入:root = [2,1,3]
輸出:[2,3,1]

示例 3:

輸入:root = []
輸出:[]

提示:

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

總體思路

使用遞歸的深度優先搜索 DFS方法來翻轉二叉樹。其核心思想是:

  1. 遞歸地翻轉左子樹
  2. 遞歸地翻轉右子樹
  3. 交換當前節點的左右子節點
  4. 基礎情況:當節點為空時,直接返回(遞歸終止條件)

這種后序遍歷的方式確保在交換當前節點的子節點之前,其左右子樹都已經被正確翻轉。

時間復雜度與空間復雜度

時間復雜度:O(n)

  • 每個節點恰好被訪問一次,n為二叉樹中的節點數量
  • 每個節點進行常數時間的操作(交換指針)

空間復雜度:O(h),其中h是樹的高度

  • 空間復雜度主要由遞歸調用棧的深度決定
  • 在最壞情況下(樹退化為鏈表),h = n,空間復雜度為O(n)
  • 在最好情況下(平衡二叉樹),h = logn,空間復雜度為O(logn)
  • 平均情況下,空間復雜度為O(h)

代碼

golang

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func invertTree(root *TreeNode) *TreeNode {if root == nil {return root}root.Left = invertTree(root.Left)root.Right = invertTree(root.Right)root.Left, root.Right = root.Right, root.Leftreturn root
}
/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func invertTree(root *TreeNode) *TreeNode {// 基礎情況:如果當前節點為空,直接返回// 這是遞歸的終止條件,空節點不需要翻轉if root == nil {return root}// 遞歸地翻轉左子樹// 將左子樹完全翻轉后,返回翻轉后的左子樹根節點root.Left = invertTree(root.Left)// 遞歸地翻轉右子樹// 將右子樹完全翻轉后,返回翻轉后的右子樹根節點root.Right = invertTree(root.Right)// 交換當前節點的左右子節點// 使用Go的多重賦值特性,不需要臨時變量root.Left, root.Right = root.Right, root.Left// 返回翻轉后的當前子樹根節點return root
}

101. 對稱二叉樹

題目

給你一個二叉樹的根節點 root , 檢查它是否軸對稱。

示例 1:
在這里插入圖片描述
輸入:root = [1,2,2,3,4,4,3]
輸出:true

示例 2:
在這里插入圖片描述
輸入:root = [1,2,2,null,3,null,3]
輸出:false

提示:

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

進階:你可以運用遞歸和迭代兩種方法解決這個問題嗎?

總體思路

這段代碼使用**廣度優先搜索(BFS)**的方法來判斷二叉樹是否軸對稱(鏡像對稱)。其核心思想是:

  1. 將需要比較的節點成對放入隊列中(左子樹的左節點 vs 右子樹的右節點,左子樹的右節點 vs 右子樹的左節點)
  2. 每次從隊列中取出一對節點進行比較
  3. 如果所有對應的節點對都滿足鏡像關系,則二叉樹是對稱的

時間復雜度與空間復雜度

時間復雜度:O(n)

  • 每個節點最多被訪問一次,n為二叉樹中的節點數量
  • 每個節點進行常數時間的比較操作

空間復雜度:O(n)

  • 在最壞情況下(完全二叉樹),隊列中最多會存儲約n/2個節點對
  • 空間復雜度主要由隊列的大小決定

代碼

golang

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func isSymmetric(root *TreeNode) bool {if root == nil {return true}type pair struct{l, r *TreeNode}q := []pair{{root.Left, root.Right}}for len(q) > 0 {p := q[0]q = q[1:]left, right := p.l, p.rif left == nil && right == nil {continue}if left == nil || right == nil {return false}if left.Val != right.Val {return false}q = append(q,pair{left.Left,right.Right})q = append(q, pair{left.Right, right.Left})}return true
}
package maintype TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}// isSymmetric 判斷二叉樹是否軸對稱(鏡像對稱)
func isSymmetric(root *TreeNode) bool {// 如果根節點為空,空樹被認為是對稱的if root == nil {return true}// 定義pair結構體來存儲需要比較的一對節點// l: 左子樹中的某個節點,r: 右子樹中對應的鏡像節點type pair struct{ l, r *TreeNode }// 初始化隊列,首先將根節點的左右子節點作為第一對需要比較的節點q := []pair{{root.Left, root.Right}}// 當隊列不為空時循環處理for len(q) >  {// 從隊列頭部取出一對節點p := q[0]q = q[1:]  // 移除隊列頭部元素left, right := p.l, p.r// 如果兩個節點都為空,說明對稱,繼續檢查其他節點對if left == nil && right == nil {continue}// 如果只有一個節點為空,另一個不為空,說明不對稱if left == nil || right == nil {return false}// 如果兩個節點都不為空,但值不相等,說明不對稱if left.Val != right.Val {return false}// 將下一層需要比較的節點對加入隊列:// 1. 左節點的左子節點 vs 右節點的右子節點(外側比較)// 2. 左節點的右子節點 vs 右節點的左子節點(內側比較)q = append(q, pair{left.Left, right.Right})q = append(q, pair{left.Right, right.Left})}// 如果所有節點對都通過檢查,說明二叉樹是對稱的return true
}

知識點

q := []pair{{root.Left, root.Right}}

這一行是 Go 語言里“構造切片并初始化第一個元素”的寫法,拆開來看就明白了:

  1. []pair{ ... }
    表示創建一個元素類型為 pair 的切片(slice)。
  2. {{root.Left, root.Right}}
    切片里只放 一個元素,這個元素又是一個 pair 結構體,所以用兩層花括號
    • 外層 {} 是“切片字面量”;
    • 內層 {} 是“結構體字面量”,給 pair 的字段 lr 分別賦值為 root.Leftroot.Right

等價于:

q := make([]pair, 0, 1)
q = append(q, pair{l: root.Left, r: root.Right})

只是第一種寫法更簡潔,常用來一次性初始化切片。

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

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

相關文章

【RNN-LSTM-GRU】第三篇 LSTM門控機制詳解:告別梯度消失,讓神經網絡擁有長期記憶

深入剖析LSTM的三大門控機制&#xff1a;遺忘門、輸入門、輸出門&#xff0c;通過直觀比喻、數學原理和代碼實現&#xff0c;徹底理解如何解決長期依賴問題。1. 引言&#xff1a;為什么需要LSTM&#xff1f;在上一篇講解RNN的文章中&#xff0c;我們了解到??循環神經網絡&…

殘差去噪擴散模型

論文題目:Residual Denoising Diffusion Models(殘差去噪擴散模型) 會議:CVPR2024 摘要:殘差去噪擴散模型(RDDM)是一種新的雙重擴散過程,它將傳統的單一去噪擴散過程解耦為殘差擴散和噪聲擴散。這種雙重擴散框架通過引入殘差,將基于去噪的擴散模型擴展為一種統一的、可…

MySQL與ES索引區別

MySQL與ES索引區別 MySQL索引像字典目錄&#xff0c;ES索引更像整個圖書館的書籍分類系統。 關鍵限制&#xff1a;MySQL單表索引大小影響寫性能&#xff0c;ES的分片數創建后不能改。 比如MySQL的“行”對應ES的“文檔”&#xff0c;MySQL的“表”類似ES的“索引”概念。 MySQL…

vue3圖標終極方案【npm包推薦】vue3-icon-sui(含源碼詳解)

簡介 為徹底實現 vue3 項目圖標自由&#xff0c;特開發此 npm包 vue3-icon-sui&#xff0c;全品類圖標&#xff0c;通通支持&#xff01; iconify 圖標svg 圖標font-class 圖標 安裝 npm i vue3-icon-sui -S使用 按需導入 任意頁面中 import myIcon from "vue3-icon-su…

redis----持久化

Redis 提供了兩種主要的持久化機制&#xff0c;用于將內存中的數據保存到磁盤&#xff0c;以防止服務器重啟或故障導致數據丟失。這兩種機制分別是 RDB&#xff08;Redis Database&#xff09;和 AOF&#xff08;Append Only File&#xff09;。1. RDB 持久化RDB 是 Redis 默認…

Docker快速部署Mongodb主副本集實踐

系列文章目錄 第一章 Mongodb的主副本集 文章目錄系列文章目錄前言一、Mongodb基礎介紹數據庫&#xff08;Database&#xff09;集合&#xff08;Collection&#xff09;文檔&#xff08;Document&#xff09;BSON&#xff08;Binary JSON&#xff09;_id&#xff08;主鍵&…

FC平臺安裝Windows Server2016并連接V6存儲

創建 windows server2016 上傳ISO創建虛擬機安裝OS 加載光盤掛載成功之后&#xff0c;重啟虛擬機重啟之后VNC登錄即可。在FC上安裝windows&#xff0c;安裝完成后&#xff0c;必須安裝tools工具&#xff0c;不然沒有虛擬網卡&#xff0c;無法配置ip地址。Windows主機安裝toolsW…

農業XR數字融合工作站,賦能農業專業實踐學習

隨著數字技術與農業的深度融合&#xff0c;農業專業XR數字融合工作站為農業專業學生提供了沉浸式、交互式的學習體驗。農業專業XR數字融合工作站作為集PC、VR、MR技術于一體的軟硬件集成平臺&#xff0c;通過虛擬仿真、數字孿生等技術手段&#xff0c;有效解決了傳統農業教育中…

積分球的使用——簡易版

這篇寫的比較雜。積分球的功能積分球——測量燈具等光源的總光通量、光效、色溫、顯色指數等參數。使用方法1.開啟積分球系統&#xff08;探測器、光度計、光譜儀&#xff09;&#xff0c;充分預熱&#xff08;15-30分鐘&#xff09;&#xff0c;使得電子設備穩定&#xff0c;減…

[光學原理與應用-435]:晶體光學 - 晶體的結構-基元/原胞/晶胞/點陣

晶體的結構可通過基元、原胞、晶胞和點陣四個核心概念進行系統描述&#xff0c;它們共同揭示了晶體中原子排列的周期性與對稱性規律&#xff0c;具體如下&#xff1a;1. 基元&#xff08;Structure Motif&#xff09;定義&#xff1a;基元是晶體中重復排列的最小結構單元&#…

電腦音頻錄制 | 系統麥克混錄 / 系統聲卡直錄 | 方法匯總 / 常見問題

注&#xff1a;本文為 “電腦音頻錄制 ” 相關合輯。 英文引文&#xff0c;機翻未校。 未整理去重&#xff0c;如有內容異常&#xff0c;請看原文。 How to Record Computer Audio in 6 Free Ways 如何用 6 種免費方式錄制電腦音頻 Sponsored by EaseUS Nov 28, 2023 4:34 a…

2025高教社國賽數學建模競賽B題完整參考論文(含模型和代碼)

2025國賽數學建模競賽B題完整參考論文 目錄 一、 問題重述 1.1 問題背景 1.2 問題回顧與分析 二、 模型假設 三、 符號說明 四、 問題求解與分析 4.1數據預處理 4.2 問題1求解與分析 4.2.1 問題1分析 4.2.2 問題1建模與求解 4.2.3 問題1結果與分析 4.3 問題2求解與分…

OpenSSL 1.0.1e 下載解壓和運行方法(小白適用 附安裝包)?

openssl-1.0.1e.zip? 是 OpenSSL 加密工具包的一個舊版本&#xff08;發布于 2013 年左右&#xff09;的 ?源代碼壓縮包&#xff0c;文件格式是 ZIP 壓縮格式。 一、下載與解壓 ?下載文件? 假如你已經有了 openssl-1.0.1e.zip 這個壓縮包&#xff0c;就跳過這步。 如果沒有…

MapStruct詳解

提到屬性拷貝&#xff0c;首先想到的BeanUtils。 先簡單的回憶下BeanUtils&#xff0c;處理Java Bean之間的屬性拷貝&#xff1b;不過由于它是通過反射來拷貝屬性&#xff0c;在數據量大一些的時候性能會降低&#xff1b; 且在安全方面也會比較弱&#xff1b; MapStruct是編譯期…

8.FC平臺模塊梳理

文章目錄8.FC平臺模塊梳理8.1. 內存復用技術特點應用價值8.2. 虛擬機啟用策略8.3. NUMA8.4. HA高可用8.5. 故障和響應策略8.6. DRS 和 DPM8.7. IMC8.FC平臺模塊梳理 8.1. 內存復用 內存共享內存交換內存氣泡 內存共享&#xff1a;多臺虛擬機共享數據內容相同的內存頁。內存交換…

貪心算法應用:DNA自組裝問題詳解

JAVA中的貪心算法應用&#xff1a;DNA自組裝問題詳解 1. DNA自組裝問題概述 DNA自組裝(DNA Self-Assembly)是分子計算和納米技術中的一個重要問題&#xff0c;它利用DNA分子的互補配對特性&#xff0c;通過精心設計DNA序列&#xff0c;使其自發地組裝成預定的納米結構。在計算機…

數據湖如何打造統一存儲與處理方案(結構化數據、半結構化數據和非結構化數據)

目錄 1. 數據湖的“包容哲學”:為什么需要統一方案? 數據湖的核心訴求 案例:零售企業的痛點 2. 存儲層設計:給數據找個舒適的家 分區與分層存儲 選擇存儲格式 案例:Parquet的威力 云存儲的選擇 3. 元數據管理:給數據湖裝上“導航儀” 元數據管理的核心組件 主流…

AUTOSAR進階圖解==>AUTOSAR_SWS_TTCANDriver

TTCAN驅動器詳細規范 AUTOSAR TTCAN Driver Specification with Enhanced Visual Documentation目錄 1. 概述2. TTCAN控制器狀態機3. TTCAN模塊架構4. TTCAN時間觸發操作序列5. TTCAN錯誤處理流程6. 總結 1. 概述 TTCAN&#xff08;Time-Triggered CAN&#xff09;驅動器是AU…

equals 定義不一致導致list contains錯誤

錯誤代碼如下&#xff1a;for (int i0;i< rows.size();i) {Row r rows.get(i);if (r.equals(row)) {assertTrue(rows.contains(row));return;}}cassertTrue(rows.contains(row));返回了false&#xff0c;看起來很奇怪&#xff0c;此時equals 定義如下&#xff1a;public bo…

【Python基礎】 20 Rust 與 Python 循環語句完整對比筆記

一、基本循環結構對比 Rust 循環類型 // 1. loop - 無限循環 let mut count 0; loop {count 1;if count > 5 {break;} }// 2. while - 條件循環 let mut number 3; while number ! 0 {println!("{}!", number);number - 1; }// 3. for - 迭代循環 for i in 0..…