100. 相同的樹(Java)

目錄

解法:

官方解法:

方法一:深度優先搜索

復雜度分析

時間復雜度:

空間復雜度:

方法二:廣度優先搜索

復雜度分析

時間復雜度:

空間復雜度:


給你兩棵二叉樹的根節點?p?和?q?,編寫一個函數來檢驗這兩棵樹是否相同。

如果兩個樹在結構上相同,并且節點具有相同的值,則認為它們是相同的。

示例 1:

輸入:p = [1,2,3], q = [1,2,3]
輸出:true

示例 2:

輸入:p = [1,2], q = [1,null,2]
輸出:false

示例 3:

輸入:p = [1,2,1], q = [1,1,2]
輸出:false

提示:

  • 兩棵樹上的節點數目都在范圍?[0, 100]?內
  • -10^4?<= Node.val <= 10^4

解法:

用深度優先遍歷的方法將樹中的元素分別取出,用StringBuilder進行接收,然后用equals方法判斷是否相同。

/*** Definition for a binary tree node.* public 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 isSameTree(TreeNode p, TreeNode q) {StringBuilder sb1 = new StringBuilder();StringBuilder sb2 = new StringBuilder();hasNextNode(p, sb1);hasNextNode(q, sb2);return sb1.toString().equals(sb2.toString());}public void hasNextNode(TreeNode root, StringBuilder sb) {if (root == null) {return;} else {sb.append(root.val).append("-");}if (root.left != null) {hasNextNode(root.left, sb);} else {sb.append("-");}if (root.right != null) {hasNextNode(root.right, sb);} else {sb.append("-");}}
}


官方解法:

方法一:深度優先搜索

如果兩個二叉樹都為空,則兩個二叉樹相同。如果兩個二叉樹中有且只有一個為空,則兩個二叉樹一定不相同。

如果兩個二叉樹都不為空,那么首先判斷它們的根節點的值是否相同,若不相同則兩個二叉樹一定不同,若相同,再分別判斷兩個二叉樹的左子樹是否相同以及右子樹是否相同。這是一個遞歸的過程,因此可以使用深度優先搜索,遞歸地判斷兩個二叉樹是否相同。

class Solution {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;} else {return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);}}
}

復雜度分析

時間復雜度:

O(min?(m,n)),其中 m 和 n?分別是兩個二叉樹的節點數。對兩個二叉樹同時進行深度優先搜索,只有當兩個二叉樹中的對應節點都不為空時才會訪問到該節點,因此被訪問到的節點數不會超過較小的二叉樹的節點數。

空間復雜度:

O(min?(m,n)),其中 m 和 n 分別是兩個二叉樹的節點數。空間復雜度取決于遞歸調用的層數,遞歸調用的層數不會超過較小的二叉樹的最大高度,最壞情況下,二叉樹的高度等于節點數。

方法二:廣度優先搜索

也可以通過廣度優先搜索判斷兩個二叉樹是否相同。同樣首先判斷兩個二叉樹是否為空,如果兩個二叉樹都不為空,則從兩個二叉樹的根節點開始廣度優先搜索。

使用兩個隊列分別存儲兩個二叉樹的節點。初始時將兩個二叉樹的根節點分別加入兩個隊列。每次從兩個隊列各取出一個節點,進行如下比較操作。

1.比較兩個節點的值,如果兩個節點的值不相同則兩個二叉樹一定不同;

2.如果兩個節點的值相同,則判斷兩個節點的子節點是否為空,如果只有一個節點的左子節點為空,或者只有一個節點的右子節點為空,則兩個二叉樹的結構不同,因此兩個二叉樹一定不同;

3.如果兩個節點的子節點的結構相同,則將兩個節點的非空子節點分別加入兩個隊列,子節點加入隊列時需要注意順序,如果左右子節點都不為空,則先加入左子節點,后加入右子節點。

如果搜索結束時兩個隊列同時為空,則兩個二叉樹相同。如果只有一個隊列為空,則兩個二叉樹的結構不同,因此兩個二叉樹不同。

class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if (p == null && q == null) {return true;} else if (p == null || q == null) {return false;}Queue<TreeNode> queue1 = new LinkedList<TreeNode>();Queue<TreeNode> queue2 = new LinkedList<TreeNode>();queue1.offer(p);queue2.offer(q);while (!queue1.isEmpty() && !queue2.isEmpty()) {TreeNode node1 = queue1.poll();TreeNode node2 = queue2.poll();if (node1.val != node2.val) {return false;}TreeNode left1 = node1.left, right1 = node1.right, left2 = node2.left, right2 = node2.right;if (left1 == null ^ left2 == null) {return false;}if (right1 == null ^ right2 == null) {return false;}if (left1 != null) {queue1.offer(left1);}if (right1 != null) {queue1.offer(right1);}if (left2 != null) {queue2.offer(left2);}if (right2 != null) {queue2.offer(right2);}}return queue1.isEmpty() && queue2.isEmpty();}
}

復雜度分析

時間復雜度:

O(min?(m,n)),其中 m 和 n 分別是兩個二叉樹的節點數。對兩個二叉樹同時進行廣度優先搜索,只有當兩個二叉樹中的對應節點都不為空時才會訪問到該節點,因此被訪問到的節點數不會超過較小的二叉樹的節點數。

空間復雜度:

O(min?(m,n)),其中 m?和 n 分別是兩個二叉樹的節點數。空間復雜度取決于隊列中的元素個數,隊列中的元素個數不會超過較小的二叉樹的節點數。


官方解法部分:

作者:力扣官方題解
鏈接:https://leetcode.cn/problems/same-tree/

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

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

相關文章

L1-028:判斷素數

題目描述 本題的目標很簡單&#xff0c;就是判斷一個給定的正整數是否素數。 輸入格式&#xff1a; 輸入在第一行給出一個正整數N&#xff08;≤ 10&#xff09;&#xff0c;隨后N行&#xff0c;每行給出一個小于231的需要判斷的正整數。 輸出格式&#xff1a; 對每個需要判斷的…

Kotlin(十五) 高階函數詳解

高階函數的定義 高階函數和Lambda的關系是密不可分的。在之前的文章中&#xff0c;我們熟悉了Lambda編程的基礎知識&#xff0c;并且掌握了一些與集合相關的函數式API的用法&#xff0c;如map、filter函數等。另外&#xff0c;我們也了解了Kotlin的標準函數&#xff0c;如run、…

vuepress-----22、其他評論方案

vuepress 支持評論 本文講述 vuepress 站點如何集成評論系統&#xff0c;選型是 valineleancloud, 支持匿名評論&#xff0c;缺點是數據沒有存儲在自己手里。市面上也有其他的方案, 如 gitalk,vssue 等, 但需要用戶登錄 github 才能發表評論, 但 github 經常無法連接,導致體驗…

[wp]“古劍山”第一屆全國大學生網絡攻防大賽 Web部分wp

“古劍山”第一屆全國大學生網絡攻防大賽 群友說是原題杯 哈哈哈哈 我也不懂 我比賽打的少 Web Web | unse 源碼&#xff1a; <?phpinclude("./test.php");if(isset($_GET[fun])){if(justafun($_GET[fun])){include($_GET[fun]);}}else{unserialize($_GET[…

使用cmake構建的工程的編譯方法

1、克隆項目工程 2、進入到工程目錄 3、執行 mkdir build && cd build 4、執行 cmake .. 5、執行 make 執行以上步驟即可完成對cmake編寫的工程進行編譯 &#xff0c;后面只需執行你的編譯結果即可 $ git clone 你想要克隆的代碼路徑 $ cd 代碼文件夾 $ mkdir bu…

測試:SRE

SRE&#xff08;Site Reliability Engineering&#xff0c;站點可靠性工程&#xff09;是一種關注于構建、運行和維護大規模分布式系統的工程學科。它旨在確保系統在各種故障情況下仍然可用、可靠和高效。 SRE的核心目標是通過軟件工程的方法來解決系統可靠性問題&#xff0c;…

WPF DataGrid 里面的ToggleButton點擊不生效

已解決&#xff1a;根本原因是沒寫UpdateSourceTriggerPropertyChanged <ToggleButton IsChecked"{Binding PathIsEnabled,ModeTwoWay,UpdateSourceTriggerPropertyChanged}"/> 具體原因參考下面文章&#xff1a;鳴謝作者 WPF 數據集合綁定到DataGrid、ListV…

vmware安裝centos7總結

vmware安裝centos7總結 文章目錄 vmware安裝centos7總結一、配置網絡&#xff08;橋接模式&#xff09;二、配置yum源&#xff08;連網配置&#xff09;三、可視化界面四、安裝Docker五、安裝DockerUI 一、配置網絡&#xff08;橋接模式&#xff09; 網絡連接模式選擇橋接模式…

Ubuntu安裝nvidia GPU顯卡驅動教程

Ubuntu安裝nvidia顯卡驅動 1.安裝前安裝必要的依賴 sudo apt-get install build-essential sudo apt-get install g sudo apt-get install make2.到官網下載對應驅動 https://www.nvidia.cn/Download/index.aspx?langcn 3.卸載原有驅動 sudo apt-get remove --purge nvidi…

深度學習:注意力機制(Attention Mechanism)

1 注意力機制概述 1.1 定義 注意力機制&#xff08;Attention Mechanism&#xff09;是深度學習領域中的一種重要技術&#xff0c;特別是在序列模型如自然語言處理&#xff08;NLP&#xff09;和計算機視覺中。它使模型能夠聚焦于輸入數據的重要部分&#xff0c;從而提高整體…

孩子都能學會的FPGA:第二十五課——用FPGA實現頻率計

&#xff08;原創聲明&#xff1a;該文是作者的原創&#xff0c;面向對象是FPGA入門者&#xff0c;后續會有進階的高級教程。宗旨是讓每個想做FPGA的人輕松入門&#xff0c;作者不光讓大家知其然&#xff0c;還要讓大家知其所以然&#xff01;每個工程作者都搭建了全自動化的仿…

基于SpringBoot+maven+Mybatis+html慢性病報銷系統(源碼+數據庫)

一、項目簡介 本項目是一套基于SpringBootmavenMybatishtml慢性病報銷系統&#xff0c;主要針對計算機相關專業的正在做bishe的學生和需要項目實戰練習的Java學習者。 包含&#xff1a;項目源碼、數據庫腳本等&#xff0c;該項目可以直接作為bishe使用。 項目都經過嚴格調試&a…

二十一章(網絡通信)

計算機網絡實現了多臺計算機間的互聯&#xff0c;使得它們彼此之間能夠進行數據交流。網絡應用程序就是在已連接的不同計算機上運行的程序&#xff0c;這些程序借助于網絡協議&#xff0c;相互之間可以交換數據。編寫網絡應用程序前&#xff0c;首先必須明確所要使用的網絡協議…

C++_命名空間(namespace)

目錄 1、namespace的重要性 2、 namespace的定義及作用 2.1 作用域限定符 3、命名空間域與全局域的關系 4、命名空間的嵌套 5、展開命名空間的方法 5.1 特定展開 5.1 部分展開 5.2 全部展開 結語&#xff1a; 前言&#xff1a; C作為c語言的“升級版”&#xff0c;其在…

快速排序的新用法

普通快排 簡介 快速排序是一種高效的排序算法&#xff0c;利用分治的思想進行排序。它的基本原理是在待排序的n個數據中任取一個數據為分區標準&#xff0c;把所有小于該排序碼的數據移到左邊&#xff0c;把所有大于該排序碼的數據移到右邊&#xff0c;中間放所選記錄&#x…

Spring 之 @Cacheable 緩存使用教程

1、Cacheable 指定使用緩存 定義個 Controller &#xff0c;在方法上加上注解 Cacheable&#xff0c;配置要使用哪些緩存&#xff0c;比如 myMapCache 表示一級緩存是 Map&#xff0c;myRedisCache 表示二級緩存是 Redis。并配置緩存 key。 key 由 SPEL 表達式組成&#xff0c…

異常檢測 | MATLAB實現BiLSTM(雙向長短期記憶神經網絡)數據異常檢測

異常檢測 | MATLAB實現BiLSTM(雙向長短期記憶神經網絡)數據異常檢測 目錄 異常檢測 | MATLAB實現BiLSTM(雙向長短期記憶神經網絡)數據異常檢測效果一覽基本介紹模型準備模型設計參考資料效果一覽 基本介紹 訓練一個雙向 LSTM 自動編碼器來檢測機器是否正常工作。 自動編碼器接受…

CleanMyMac X2024最新版本軟件實用性測評

信大多數MAC用戶都較為了解&#xff0c;Mac雖然有著許多亮點的性能&#xff0c;但是讓用戶叫苦不迭的還其硬盤空間小的特色&#xff0c;至于很多人因為文件堆積以及軟件緩存等&#xff0c;造成系統空間內存不夠使用的情況。于是清理工具就成為了大多數MAC用戶使用頻率較高的實用…

二十一章網絡通信

計算機網絡實現了多臺計算機間的互聯&#xff0c;使得它們彼此之間能夠進行數據交流。網絡應用程序就是在已連接的不同計算機上運行的程序&#xff0c;這些程序借助于網絡協議&#xff0c;相互之間可以交換數據。編寫網絡應用程序前&#xff0c;首先必須明確所要使用的網絡協議…

數據采集工具的大全【都是免費值得收藏】

數據是推動業務成功的關鍵之一。為了獲取準確、全面的信息&#xff0c;數據采集成為了許多企業和個人的必備工作。本文將專注于數據采集工具&#xff0c;探討其在全網和指定網站采集方面的優勢&#xff0c;為大家提供對比分析&#xff0c;以幫助大家找到最適合的數據采集利器。…