比較兩種判斷相同二叉樹的方法:遞歸與遍歷序列對比

在二叉樹操作中,判斷兩棵樹是否相同是一個常見的問題。本文將對比兩種不同的解決方案:遞歸法遍歷序列對比法,分析它們的優缺點,并探討為何遞歸法是更優的選擇。

問題描述

給定兩棵二叉樹的根節點?p?和?q,判斷它們是否在結構和節點值上完全相同。

方法一:遞歸法

遞歸法的核心思想是逐層比較節點,確保每個節點的值和結構一致。

public boolean isSameTree(TreeNode p, TreeNode q) {if (p == null && q == null) return true;else if (p == null || q == null) return false;else if (p.val != q.val) return false;return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
分析
  1. 正確性:遞歸法直接比較當前節點的值和結構,并遞歸檢查左右子樹。只有當所有對應節點均匹配時,才返回?true

  2. 時間復雜度:O(n),每個節點僅訪問一次。

  3. 空間復雜度:O(h),其中 h 為樹的高度(遞歸棧的深度)。

方法二:遍歷序列對比法

該方法通過生成兩棵樹的前序、中序和后序遍歷序列,并比較三者是否完全一致。

class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {List<Integer> arrMiddleP = new ArrayList<Integer>();List<Integer> arrMiddleQ = new ArrayList<Integer>();List<Integer> preP = new ArrayList<Integer>();List<Integer> preQ = new ArrayList<Integer>();List<Integer> afterP = new ArrayList<Integer>();List<Integer> afterQ = new ArrayList<Integer>();middle(p, arrMiddleP);middle(q, arrMiddleQ);pre(p, preP);pre(q, preQ);after(p, afterP);after(q, afterQ);if (arrMiddleP.equals(arrMiddleQ) && preP.equals(preQ)&&(afterP.equals(afterQ))) {return true;}return false;}public void middle(TreeNode x, List<Integer> arrMiddle) {if (x == null) {return;}middle(x.left, arrMiddle);arrMiddle.add(x.val);middle(x.right, arrMiddle);}public void pre(TreeNode x, List<Integer> arrPre) {if (x == null) {return;}arrPre.add(x.val);pre(x.left, arrPre);pre(x.right, arrPre);}public void after(TreeNode x, List<Integer> arrPre) {if (x == null) {return;}after(x.left, arrPre);after(x.right, arrPre);arrPre.add(x.val);}}
分析
  1. 思路:如果兩棵樹的前序、中序、后序遍歷結果完全相同,則認為它們相同。

  2. 潛在問題

    • 結構信息丟失:遍歷序列未記錄?null?節點,導致不同結構的樹可能生成相同的遍歷序列。例如:

      • 樹 A:根節點為?1,左子節點為?1

      • 樹 B:根節點為?1,右子節點為?1
        兩者的前序、中序、后序結果均為?[1, 1],但結構不同。

    • 重復值問題:當節點值重復時,遍歷序列無法區分結構差異。

  3. 效率:需要三次遍歷,時間和空間復雜度均為 O(n),效率低于遞歸法。


對比與結論

方法正確性時間復雜度空間復雜度結構敏感性
遞歸法?O(n)O(h)?
遍歷序列對比法?O(n)O(n)?
  1. 正確性:遞歸法直接比較結構和值,適用于所有情況。遍歷序列法在節點值重復或結構歧義時可能失效。

  2. 效率:遞歸法在早期發現不同時可立即返回,而遍歷序列法必須完成所有遍歷。

  3. 實現復雜度:遞歸法代碼簡潔,邏輯清晰;遍歷序列法需要額外生成和比較多個序列。


為什么遞歸法更優?

  • 結構敏感性:遞歸法嚴格檢查每個節點的位置和值,確保結構完全一致。

  • 提前終止:一旦發現節點不匹配,遞歸立即終止,避免不必要的遍歷。

  • 資源友好:無需存儲遍歷結果,空間復雜度更低。

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

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

相關文章

從0開始學習大模型--Day01--大模型是什么

初識大模型 在平時遇到問題時&#xff0c;我們總是習慣性地去運用各種搜索引擎如百度、知乎、CSDN等平臺去搜索答案&#xff0c;但由于搜索到的內容質量參差不齊&#xff0c;檢索到的內容只是單純地根據關鍵字給出內容&#xff0c;往往看了幾個網頁都找不到答案&#xff1b;而…

【AI大模型】SpringBoot整合Spring AI 核心組件使用詳解

目錄 一、前言 二、Spring AI介紹 2.1 Spring AI介紹 2.2 Spring AI主要特點 2.3 Spring AI核心組件 2.4 Spring AI應用場景 2.5 Spring AI優勢 2.5.1 與 Spring 生態無縫集成 2.5.2 模塊化設計 2.5.3 簡化 AI 集成 2.5.4 支持云原生和分布式計算 2.5.5 安全性保障…

洛谷 P9007 [入門賽 #9] 最澄澈的空與海 (Hard Version)

這道題可不入門。 [Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 給定 n n n&#xff0c;求有多少組 ( x , y , z ) (x,y,z) (x,y,z) 滿足&#xff1a; x ? y z n ! x-\dfrac{y}{z}n! x?zy?n! x ? y z n ! n \dfrac{x-y…

PostgreSQL 的 pg_stat_file 函數

PostgreSQL 的 pg_stat_file 函數 pg_stat_file 是 PostgreSQL 提供的一個系統管理函數&#xff0c;用于獲取文件系統上文件的元數據信息。這個函數對于數據庫管理員進行文件級別的監控和診斷非常有用。 一 函數基本語法 pg_stat_file(filename text [, missing_ok boolean …

關于麒麟服務器實現docker-compose服務開機自啟

我本地服務器環境是麒麟V10版本&#xff1a; 首先確定docker-compose服務絕對路徑命令&#xff1a; which docker-compose我這里輸出是&#xff1a;/usr/bin/docker-compose 編輯服務文件&#xff1a; sudo vim /etc/systemd/system/docker-compose-webup.service[Unit] Desc…

基于 jQuery 實現復選框全選與選中項查詢功能

在 Web 開發中&#xff0c;復選框是常見的交互元素&#xff0c;尤其是在涉及批量操作、數據篩選等場景時&#xff0c;全選功能和選中項查詢功能顯得尤為重要。本文將介紹如何使用 HTML、CSS 和 jQuery 實現一個具備全選、反選以及選中項查詢功能的復選框組&#xff0c;幫助開發…

AfuseKt2.4.2 | 支持阿里云盤、Alist等平臺視頻播放,具備自動海報墻刮削功能的強大播放器

AfuseKt是一款功能強大的安卓端在線視頻播放器&#xff0c;支持播放阿里云盤、Alist、WebDAV等平臺的視頻內容。它具備自動海報墻刮削功能&#xff0c;能自動生成影片信息和海報墻&#xff0c;提供良好的視覺體驗。此外&#xff0c;它還支持倍速播放、字幕、音軌切換等多種實用…

Netlink在SONiC中的應用

Netlink在SONiC中的應用 Netlink介紹 Netlink 是 Linux 內核態程序與用戶空間程序之間進行通信的機制之一&#xff0c;原本是用于傳遞網絡協議棧中的各種控制消息。它采用和套接字&#xff08;socket&#xff09;編程接口相同的形式&#xff0c;常用于配置內核網絡子系統&…

語音合成之十一 提升TTS語音合成效果:低質量數據清洗、增強與數據擴增

低質量數據清洗、增強與數據擴增 1. 引言&#xff1a;TTS的基石——數據質量2. 基礎&#xff1a;TTS數據準備工作流2.1 規劃&#xff1a;定義藍圖2.2 執行&#xff1a;從原始數據到訓練就緒格式2.3 最佳實踐與可復現性 3. 攻克缺陷&#xff1a;低質量語音數據的清洗與增強3.2 手…

Java IO流分類與記憶方法

Java IO流分類與記憶方法 在Java IO流體系中,理解節點流和包裝流的區別是掌握IO編程的關鍵。 一、核心分類標準 1. 節點流(Node Stream) 直接對接數據源:直接連接物理IO設備(文件、網絡、內存等)基礎功能:提供最基礎的讀寫能力命名特征:通常包含數據源類型名稱(如Fi…

架構師如何構建個人IP:職業規劃與業務戰略的雙重提升

在數字化時代&#xff0c;軟件架構師的角色已從單純的技術專家轉變為兼具技術領導力和業務影響力的復合型人才。如何構建個人IP&#xff0c;提升行業影響力&#xff0c;成為架構師職業發展的關鍵課題。本文從個人認知、業務戰略、架構決策、產品思維四個維度&#xff0c;探討架…

vscode運行python的快捷鍵

以下是一些在 VS Code 中運行 Python 代碼的常用快捷鍵&#xff1a; 運行 Python 文件 Windows/Linux &#xff1a;Ctrl F5。此快捷鍵會直接運行當前打開的 Python 文件&#xff0c;不會自動進入調試模式。若之前有配置過終端&#xff0c;一般會使用配置好的終端來運行&…

使用OpenCV 和 Dlib 實現疲勞檢測

文章目錄 引言1.相關技術介紹2. 系統原理2.1 眼睛縱橫比(EAR)算法2.2 系統工作流程 3.代碼解析3.1 關鍵函數說明3.2 主循環邏輯 4.實際應用效果5.參數調優建議6.總結 引言 疲勞駕駛是交通事故的主要原因之一。本文將介紹如何使用Python和計算機視覺技術構建一個實時疲勞駕駛檢…

VBA實現后入先出(LIFO)庫存統計

先入先出&#xff08;FIFO&#xff09;比較容易理解&#xff0c;買入早的優先賣出。與之對應的是后人先出&#xff08;LIFO&#xff09;&#xff0c;就是優先賣出最近買入的&#xff0c;例如&#xff1a;第8行賣出2K&#xff0c;當天還沒有買入記錄&#xff0c;只能找前一天的買…

Python中的客戶端和服務端交互的基本內容

目錄 網絡協議 網絡的通信方式 需要安裝的組件和需要導入的包模塊 安裝的組件 導入包模塊 如何創建客戶端 如何創建服務端 網絡協議 IPV4&#xff1a;是互聯網協議的第四版&#xff0c;也是目前廣泛使用的網絡協議。它使用32位地址格式&#xff0c;理論上可以提供約43億…

【硬核攻堅】告別CUDA OOM!DeepSeek部署顯存瓶頸終極解決方案:三大策略高效落地

目錄 引言:大模型落地的“甜蜜”與“煩惱”DeepSeek剖析:為何它如此“吃”顯存?CUDA OOM的“幽靈”:現象、根因與診斷破局之道:三大策略馴服顯存“猛獸” 策略一:模型量化 - 給模型“瘦身”的藝術策略二:動態優化 - 榨干硬件潛能策略三:分布式擴展 - 集群的力量實戰演練…

JavaSE核心知識點01基礎語法01-01(關鍵字、標識符、變量)

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 JavaSE核心知識點01基礎語法01-01&#xff0…

【最新Python包管理工具UV的介紹和安裝】

介紹 uv是一個非常快的 Python 包安裝程序和 pip 解析器&#xff0c;用 Rust 編寫&#xff0c;設計為pip-tools的直接替代品。 以下是官網給出的UV與其他包管理工具解決依賴&#xff08;左&#xff09;和安裝包&#xff08;右&#xff09;的對比圖。 可以看出UV是一個極快的 P…

麒麟、UOS系統在線打開word文件并提取修訂痕跡

麒麟、UOS系統在線打開word文件并提取修訂痕跡 查看本示例演示效果&#xff08;Windows版&#xff09; 查看本示例演示效果&#xff08;國產版&#xff09;本示例關鍵代碼的編寫位置&#xff0c;請參考“開始 - 快速上手”里您所使用的開發語言框架的最簡集成代碼 注意 本文中…

【SpringAI+阿里云百煉】AI對話4個Demo

基于SpringAI和阿里云百煉平臺&#xff0c;實現了四個AI對話的小Demo 小團團對話機器人哄哄模擬器培訓班智能客服仿ChatPDF 筆記如下:語雀知識筆記《SpringAI》