【Leetcode hot 100】101.對稱二叉樹

問題鏈接

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

問題解答

要解決 LeetCode 101 題“對稱二叉樹”,核心思路是判斷二叉樹的左右子樹是否鏡像對稱(即左子樹的結構和值與右子樹完全相反)。以下提供兩種主流解法:遞歸法(思路簡潔)和迭代法(用隊列模擬遞歸棧),均符合 Java 語法規范且通過所有測試用例。

核心邏輯鋪墊

鏡像對稱的定義:對于兩個節點 pq,需滿足 3 個條件:

  1. pq 的值相等;
  2. p 的左孩子與 q 的右孩子鏡像對稱;
  3. p 的右孩子與 q 的左孩子鏡像對稱。

空樹默認對稱;若根節點非空,則只需判斷其左子樹和右子樹是否滿足上述鏡像條件。

解法 1:遞歸法(推薦入門)

思路

  1. 特殊處理:若根節點 root 為空,直接返回 true
  2. 定義輔助函數 isMirror(p, q),判斷兩個節點是否鏡像;
  3. 遞歸調用輔助函數,傳入根節點的左子樹和右子樹。

Java 代碼(帶詳細注釋)

// 二叉樹節點定義(題目已默認提供,無需重復編寫,此處僅為說明)
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}class Solution {// 主函數:判斷整棵樹是否對稱public boolean isSymmetric(TreeNode root) {// 空樹是對稱的if (root == null) {return true;}// 遞歸判斷左子樹和右子樹是否鏡像return isMirror(root.left, root.right);}// 輔助函數:判斷兩個節點 p 和 q 是否鏡像對稱private boolean isMirror(TreeNode p, TreeNode q) {// 情況 1:兩個節點都為空 → 對稱if (p == null && q == null) {return true;}// 情況 2:一個節點為空,另一個非空 → 不對稱if (p == null || q == null) {return false;}// 情況 3:兩個節點都非空 → 需滿足「值相等 + 子節點鏡像」return (p.val == q.val)  // 值相等&& isMirror(p.left, q.right)  // p的左 vs q的右&& isMirror(p.right, q.left); // p的右 vs q的左}
}

復雜度分析

  • 時間復雜度O(n),每個節點僅遍歷一次(n 為節點總數);
  • 空間復雜度O(n),遞歸棧的深度取決于樹的高度(最壞情況為鏈狀樹,高度 = n)。

解法 2:迭代法(用隊列模擬遞歸)

思路
遞歸的本質是“隱式棧”,迭代法可用隊列(或棧)將“待比較的節點對”顯式存儲,步驟如下:

  1. 特殊處理:若根節點為空,返回 true
  2. 初始化隊列,將根節點的左子樹和右子樹作為第一對“待比較節點”入隊;
  3. 循環出隊:每次取出隊首的兩個節點 pq,按鏡像條件判斷;
  4. 入隊后續節點對:若 pq 滿足條件,將 p.leftq.rightp.rightq.left 入隊(保證下一輪比較鏡像關系);
  5. 若循環中出現不滿足條件的情況,直接返回 false;隊列空則返回 true

Java 代碼(帶詳細注釋)

import java.util.LinkedList;
import java.util.Queue;class Solution {public boolean isSymmetric(TreeNode root) {// 空樹是對稱的if (root == null) {return true;}// 初始化隊列:存儲待比較的節點對(用 LinkedList 實現 Queue 接口)Queue<TreeNode> queue = new LinkedList<>();// 先將根節點的左、右子樹入隊(第一對比較對象)queue.offer(root.left);queue.offer(root.right);// 循環處理隊列中的節點對while (!queue.isEmpty()) {// 一次取出兩個節點(成對比較)TreeNode p = queue.poll();TreeNode q = queue.poll();// 情況 1:兩個節點都為空 → 跳過(無需后續比較)if (p == null && q == null) {continue;}// 情況 2:一個空、一個非空 → 不對稱if (p == null || q == null) {return false;}// 情況 3:值不相等 → 不對稱if (p.val != q.val) {return false;}// 若當前節點對滿足條件,將下一輪的鏡像節點對入隊queue.offer(p.left);   // p的左 → 對應 q的右queue.offer(q.right);queue.offer(p.right);  // p的右 → 對應 q的左queue.offer(q.left);}// 隊列空且未返回 false → 所有節點對都滿足鏡像條件return true;}
}

復雜度分析

  • 時間復雜度O(n),每個節點僅入隊和出隊一次;
  • 空間復雜度O(n),隊列存儲的節點數取決于樹的寬度(最壞情況為滿二叉樹,葉子節點數 = n/2,隊列最大容量為 n/2)。

測試用例驗證

示例 1(對稱樹)
輸入:root = [1,2,2,3,4,4,3]
輸出:true
兩種解法均會遞歸/迭代比較 (2,2)(3,3)(4,4),全部滿足鏡像條件,返回 true

示例 2(非對稱樹)
輸入:root = [1,2,2,null,3,null,3]
輸出:false
比較 (2,2) 時,2 的左孩子為空、右孩子為 3,而另一個 2 的右孩子為空、左孩子為 3,滿足前序條件;但后續比較 (3,null) 時,一個非空一個空,返回 false

兩種解法均覆蓋題目要求,遞歸法適合理解思路,迭代法適合避免遞歸棧溢出(針對極深的樹),可根據場景選擇。

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

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

相關文章

Zynq開發實踐(FPGA之選擇開發板)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】我們之所以選用zynq開發板&#xff0c;就在于它支持arm軟件開發&#xff0c;也支持fpga開發&#xff0c;甚至可以運行linux&#xff0c;這是之前沒有…

Flutter Riverpod 3.0 發布,大規模重構下的全新狀態管理框架

在之前的 《注解模式下的 Riverpod 有什么特別之處》我們聊過 Riverpod 2.x 的設計和使用原理&#xff0c;同時當時我們就聊到作者已經在開始探索 3.0 的重構方式&#xff0c;而現在隨著 Riverpod 3.0 的發布&#xff0c;riverpod 帶來了許多細節性的變化。 當然&#xff0c;這…

Xcode 上傳 ipa 全流程詳解 App Store 上架流程、uni-app 生成 ipa 文件上傳與審核指南

對于 iOS 開發者而言&#xff0c;應用開發完成后最重要的一步就是將應用打包為 ipa 文件&#xff0c;并上傳至 App Store Connect 進行分發或上架。 其中&#xff0c;Xcode 上傳 ipa 是最常見的方法&#xff0c;但很多開發者在實際操作中常常遇到卡住、上傳失敗或簽名錯誤等問題…

快速選中對象

圖片要求 圖片背景單純&#xff0c;對象邊緣比較清晰 對象選擇工具 選擇對象選擇工具后&#xff0c;畫出大致區域&#xff0c;系統將自動分析圖片內容&#xff0c;從而實現快速選擇圖片中的一個惑多個對象他有兩種模式&#xff0c;分別是舉行與套索模式。使用時可以先選中對象的…

點到點鏈路上的OSPF動態路由(2025年9月10日)

一、前言前面我們已經分享過了靜態路由、缺省路由、浮動靜態路由這些靜態路由的配置。接下來將會 陸陸續續開始分享動態路由以及其他路由配置。博主這里是一個新人&#xff0c;了解這些路由配置不是自上而下的&#xff0c;而是自下而上的&#xff0c;也就是說通過實驗去理解原理…

技術視界 | 末端執行器:機器人的“手”,如何賦予機器以生命?

在現代自動化系統中&#xff0c;末端執行器&#xff08;End Effector&#xff09;作為機器人與物理世界交互的“手”&#xff0c;發揮著至關重要的作用。它直接安裝在機械臂末端&#xff0c;不僅是機器人實現“抓取、感知和操作”三大核心功能的關鍵部件&#xff0c;更是整個自…

滑動窗口概述

滑動窗口算法簡介滑動窗口是一種用于處理數組或字符串子區間問題的高效算法。它通過維護一個動態窗口&#xff08;通常由兩個指針表示&#xff09;來避免重復計算&#xff0c;將時間復雜度從O(n)優化到O(n)。基本實現步驟初始化窗口指針&#xff1a;通常使用left和right指針表示…

AI 創建學生管理系統

使用騰訊元寶創建&#xff0c;整體效果不錯。修正2個bug跑起來&#xff0c;達到了需要的功能先上效果圖&#xff1a;按鈕分類別配色&#xff0c;界面清爽。喜歡這布局創建過程&#xff1a;prompt: 使用最新穩定vue版&#xff0c;使用pinia存儲&#xff0c;基于typescript, 樣式…

ASP.NET Core 中的簡單授權

ASP.NET Core 中的授權通過 [Authorize] 屬性及其各種參數控制。 在其最基本的形式中&#xff0c;通過向控制器、操作或 [Authorize] Page 應用 Razor 屬性&#xff0c;可限制為僅允許經過身份驗證的用戶訪問該組件。 使用 [Authorize] 屬性 以下代碼限制為僅允許經過身份驗證…

leetcode 493 翻轉對

一、題目描述 二、解題思路 本題的思路與逆序數的思路相似&#xff0c;采用歸并排序的思路來實現。leetcode LCR 170.交易逆序對的總數-CSDN博客 注意&#xff1a;但是逆序數的ret更新在左、右區間合并時更新&#xff0c;但本題ret更新在左、右區間合并前更新。 三、代碼實現…

初識微服務-nacos配置中心

配置中心 概述 配置中心是微服務中不可或缺的組件&#xff0c;因為如果沒有配置中心&#xff0c;那么各個微服務的的配置信息無法得到統一和管理&#xff0c;會變得冗余。 :::color4 配置中心是用于管理應用程序配置信息的工具 集中管理配置&#xff1a;解決微服務架構下配置分…

Android webview更新記錄-aosp

一、下載 webview下載地址&#xff0c;感謝火哥分享&#xff0c;版本很全。 https://www.firepx.com/app/android-system-webview/ 二、更新 external/chromium-webview/prebuilt 具體更新那個目錄&#xff0c;需要查看編譯架構 這個看你的lunch就行&#xff0c;這里我的是a…

無感FOC(無傳感器磁場定向控制)

我們來詳細解析無感FOC&#xff08;無傳感器磁場定向控制&#xff09;中的高頻方波注入&#xff08;High-Frequency Square-Wave Injection, HFSWI&#xff09;?? 的原理。這是一個用于零低速或極低速范圍內估算轉子位置的核心技術。核心思想與要解決的問題在電機靜止或轉速極…

MATLAB基于博弈論組合賦權-云模型的煤與瓦斯突出危險性評價

MATLAB基于博弈論組合賦權-云模型的煤與瓦斯突出危險性評價 1. 問題背景與核心目標 背景&#xff1a;煤與瓦斯突出是煤礦生產中的一種極其復雜的動力災害&#xff0c;其發生機理復雜&#xff0c;影響因素眾多&#xff08;如地應力、瓦斯壓力、煤體物理屬性等&#xff09;。對其…

JavaWeb-Servlet總結及JSP

目錄 一、文件下載 二、ServletConfig對象 三、Web.xml文件使用總結 四、server.xml文件 五、JSP動態網頁技術 1.概念&#xff1a; 2.動態網頁&#xff1a; 3.特點&#xff1a; 4.JSP的訪問原理&#xff1a; 5.JSP的文檔說明&#xff1a; 6.jsp實際運行文件&#xff…

DDIM和DDPM之 間的區別與聯系

核心關系概述 首先&#xff0c;要理解DDIM并不是一個全新的模型&#xff0c;而是DDPM的一個精巧的重新參數化和擴展。它們使用完全相同的訓練目標和方法&#xff0c;因此你可以用一個訓練好的DDPM模型直接來運行DDIM的采樣算法&#xff0c;而無需重新訓練。 DDIM的核心貢獻是&a…

c++---map和set

這里再提二叉樹&#xff08;二叉搜索樹&#xff09;&#xff0c;是為了后面講解map和set做準備。 一、二叉搜索樹 二叉搜索樹又稱二叉排序樹&#xff0c;它或者是一棵空樹&#xff0c;或者是具有以下性質的二叉樹。 若它的左子樹不為空&#xff0c;則左子樹上所有節點的值都…

windows下,podman遷移鏡像文件位置

docker-desktop有自帶的鏡像文件位置遷移功能&#xff0c;但podman-desktop還沒有&#xff0c;所以只能自己操作wsl導入導出來實現# 1.一定要先停止當前machine podman machine stop# 2. 導出當前 machine&#xff08;會生成 tar 鏡像&#xff09; wsl --export podman-machine…

Champ-基于3D的人物圖像到動畫視頻生成框架

本文轉載自&#xff1a;https://www.hello123.com/champ ** 一、&#x1f916; Champ 是什么&#xff1f; 阿里 南大 復旦聯手打造的虛擬人動作黑科技&#xff01;Champ 可不是普通動畫工具&#xff0c;它能把你隨手拍的小視頻變成專業級 3D 動畫 —— 無論跳舞、打拳還是走…

Thingsboard 3.4 源碼運行 Mac Mini

拉取源碼 git clone https://github.com/thingsboard/thingsboard.gitjdk11 java -version java version "11.0.27" 2025-04-15 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.278-LTS-232) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.278-LTS-23…