【算法系列之五】對稱二叉樹

給定一個二叉樹,檢查它是否是鏡像對稱的。

例如,二叉樹?[1,2,2,3,4,4,3]?是對稱的。

    1/ \2   2/ \ / \
3  4 4  3

但是下面這個?[1,2,2,null,3,null,3]?則不是鏡像對稱的:

    1/ \2   2\   \3    3

說明:

如果你可以運用遞歸和迭代兩種方法解決這個問題,會很加分。

方法一:遞歸

如果一個樹的左子樹與右子樹鏡像對稱,那么這個樹是對稱的。

Push an element in stack

因此,該問題可以轉化為:兩個樹在什么情況下互為鏡像?

如果同時滿足下面的條件,兩個樹互為鏡像:

  1. 它們的兩個根結點具有相同的值。
  2. 每個樹的右子樹都與另一個樹的左子樹鏡像對稱。

Push an element in stack

就像人站在鏡子前審視自己那樣。鏡中的反射與現實中的人具有相同的頭部,但反射的右臂對應于人的左臂,反之亦然。

上面的解釋可以很自然地轉換為一個遞歸函數,如下所示:

public boolean isSymmetric(TreeNode root) {return isMirror(root, root);
}public boolean isMirror(TreeNode t1, TreeNode t2) {if (t1 == null && t2 == null) return true;if (t1 == null || t2 == null) return false;return (t1.val == t2.val)&& isMirror(t1.right, t2.left)&& isMirror(t1.left, t2.right);
}

復雜度分析

  • 時間復雜度:O(n)O(n)。因為我們遍歷整個輸入樹一次,所以總的運行時間為?O(n)O(n),其中?nn?是樹中結點的總數。
  • 空間復雜度:遞歸調用的次數受樹的高度限制。在最糟糕的情況下,樹是線性的,其高度為?O(n)O(n)。因此,在最糟糕的情況下,由棧上的遞歸調用造成的空間復雜度為?O(n)O(n)。

方法二:迭代

除了遞歸的方法外,我們也可以利用隊列進行迭代。隊列中每兩個連續的結點應該是相等的,而且它們的子樹互為鏡像。最初,隊列中包含的是?root?以及?root。該算法的工作原理類似于 BFS,但存在一些關鍵差異。每次提取兩個結點并比較它們的值。然后,將兩個結點的左右子結點按相反的順序插入隊列中。當隊列為空時,或者我們檢測到樹不對稱(即從隊列中取出兩個不相等的連續結點)時,該算法結束。

public boolean isSymmetric(TreeNode root) {Queue<TreeNode> q = new LinkedList<>();q.add(root);q.add(root);while (!q.isEmpty()) {TreeNode t1 = q.poll();TreeNode t2 = q.poll();if (t1 == null && t2 == null) continue;if (t1 == null || t2 == null) return false;if (t1.val != t2.val) return false;q.add(t1.left);q.add(t2.right);q.add(t1.right);q.add(t2.left);}return true;
}

復雜度分析

  • 時間復雜度:O(n)O(n)。因為我們遍歷整個輸入樹一次,所以總的運行時間為?O(n)O(n),其中?nn?是樹中結點的總數。
  • 空間復雜度:搜索隊列需要額外的空間。在最糟糕的情況下,我們不得不向隊列中插入?O(n)O(n)?個結點。因此,空間復雜度為?O(n)O(n)。

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

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

相關文章

【算法系列之六】兩整數之和

不使用運算符 和 - &#xff0c;計算兩整數 a 、b 之和。 示例 1: 輸入: a 1, b 2 輸出: 3示例 2: 輸入: a -2, b 3 輸出: 1 方法一&#xff1a;遞歸 public static int getSum1(int a, int b) {if ((a & b) ! 0) { // 判斷是否有進位return getSum1(a ^ b, (a &…

cuda默認函數與c++沖突_好程序員Python教程系列-第8講:函數和模塊

好程序員Python教程系列-第8講&#xff1a;函數和模塊&#xff0c;在講解本章節的內容之前&#xff0c;我們先來研究一道數學題&#xff0c;請說出下面的方程有多少組正整數解。事實上&#xff0c;上面的問題等同于將8個蘋果分成四組每組至少一個蘋果有多少種方案&#xff0c;所…

【算法系列之七】合并兩個有序鏈表

將兩個有序鏈表合并為一個新的有序鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 示例&#xff1a; 輸入&#xff1a;1->2->4, 1->3->4 輸出&#xff1a;1->1->2->3->4->4/*** Definition for singly-linked list.* public cla…

mfc讓圖片與按鈕一起_對許多張圖片進行批量裁剪,看看我是如何快速做到的

概要&#xff1a;當我們需要對很多圖片進行批量裁剪時&#xff0c;以往的辦法是自己一張一張圖片去操作&#xff0c;非常麻煩。有沒有這樣一個工具&#xff0c;能夠幫我們批量進行處理呢&#xff1f;之前小編在網上找了非常多的軟件&#xff0c;一個一個地安裝試用&#xff0c;…

【算法系列之八】刪除鏈表的倒數第N個節點

給定一個鏈表&#xff0c;刪除鏈表的倒數第 n 個節點&#xff0c;并且返回鏈表的頭結點。 示例&#xff1a; 給定一個鏈表: 1->2->3->4->5, 和 n 2.當刪除了倒數第二個節點后&#xff0c;鏈表變為 1->2->3->5.說明&#xff1a; 給定的 n 保證是有效的…

手寫分頁sql_分頁查詢SQL語句

表結構&#xff1a;DROP TABLE IF EXISTS zhoufoxcn.userlist;CREATE TABLE zhoufoxcn.userlist (UserId int(10) unsigned NOT NULL auto_increment,UserName varchar(45) NOT NULL,Age int(10) unsigned NOT NULL default 10,Sex tinyint(3) unsigned NOT NULL default 1,Ta…

【算法系列之九】合并兩個有序數組

給定兩個有序整數數組 nums1 和 nums2&#xff0c;將 nums2 合并到 nums1 中&#xff0c;使得 num1 成為一個有序數組。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。你可以假設 nums1 有足夠的空間&#xff08;空間大小大于或等于 m n&#xff09;來保存 nums2 …

把網卡指定給vm虛擬機_為VMWare虛擬網卡指定靜態的MAC地址

當你把虛擬機移到另一臺主機或在同一臺主機但不同的路徑時&#xff0c;虛擬機的MAC地址將會更改。默認情況下VMWare會保證MAC地址的唯一性卻不保存固定性&#xff0c;在每次開啟虛擬機里的系統時都可能重新分配MAC地址來保證唯一性&#xff0c;若你想保證即使虛擬機被移動后&am…

【算法系列之十】三數之和

給定一個包含 n 個整數的數組 nums&#xff0c;判斷 nums 中是否存在三個元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;找出所有滿足條件且不重復的三元組。 注意&#xff1a;答案中不可以包含重復的三元組。 例如, 給定數組 nums [-1, 0, 1,…

android 動態獲取全縣_省市縣 ------ 三級滾動(android)

預先加載仿滾輪實現的全部數據mCityPickerView.init(this);③ 點擊響應&#xff1a;ss.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {CityConfig cityConfig new CityConfig.Builder().title("選擇城市")//標題.build();m…

發電廠電氣部分第三版pdf_火力發電廠電氣主接線的特點

根據火力發電廠的容量及其在電力系統中的地位&#xff0c;一般可將火力發電廠分為區域性火力發電廠和地方性火力發電廠。這兩類火力發電廠的電氣主接線有各自的特點。一、區域性火力發電廠的電氣主接線1、單機容量及總裝機容量都較大單機容量多為300MW、600MW和少量1000MW,電廠…

【算法系列之十一】k個一組翻轉鏈表

給出一個鏈表&#xff0c;每 k 個節點一組進行翻轉&#xff0c;并返回翻轉后的鏈表。 k 是一個正整數&#xff0c;它的值小于或等于鏈表的長度。如果節點總數不是 k 的整數倍&#xff0c;那么將最后剩余節點保持原有順序。 示例 : 給定這個鏈表&#xff1a;1->2->3-&g…

ghostblog主題_讀Ghost博客源碼與自定義Ghost博客主題

我使用的Ghost博客一直使用者默認的Casper主題。我向來沒怎么打理過自己博客&#xff0c;一方面認為自己不夠專業&#xff0c;很難寫出質量比較高的文字&#xff1b;另一方面認為博客太耗時間&#xff0c;很容易影響正常的工作內容。最近公司即將搬遷&#xff0c;我的開發工作也…

【算法系列之十二】最接近的三數之和

給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數&#xff0c;使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。 例如&#xff0c;給定數組 nums [-1&#xff0c;2&#xff0c;1&#xff0c;-4], 和 target 1…

定義一個dto對象_業務代碼的救星——Java 對象轉換框架 MapStruct 妙用

在業務項目的開發中&#xff0c;我們經常需要將 Java 對象進行轉換&#xff0c;比如從將外部微服務得到的對象轉換為本域的業務對象 domainobject&#xff0c;將 domainobject 轉為數據持久層的 dataobject&#xff0c;將 domainobject 轉換為 DTO 以便返回給外部調用方等。在轉…

JVM調優總結 -Xms -Xmx -Xmn -Xss

堆大小設置 JVM 中最大堆大小有三方面限制&#xff1a;相關操作系統的數據模型&#xff08;32-bt還是64-bit&#xff09;限制&#xff1b;系統的可用虛擬內存限制&#xff1b;系統的可用物理內存限制。32位系統 下&#xff0c;一般限制在1.5G~2G&#xff1b;64為操作系統對內存…

discuz設置用戶每天回帖數_[建站教程]Discuz3.4設置QQ互聯登陸教程

雖然現在很多人已經不在使用QQ了&#xff0c;但瘦死的駱駝比馬大&#xff0c;QQ的用戶基數還是很大&#xff0c;而且QQ里有大量的年輕用戶&#xff0c;像我的表妹&#xff0c;表弟剛上初中。他們是忠誠的QQ用戶。為了獲取這批年輕的用戶&#xff0c;我們還是有必要讓網站支持QQ…

五種線程池的對比與使用

今天對五種常見的java內置線程池進行講解。 線程使用的demo public static void cache() {ExecutorService pool Executors.newCachedThreadPool();long start System.currentTimeMillis();pool.execute(() -> {int sum 0;for (int i 0; i < 10; i) {sum (int) Ma…

16進制加法 keil_C/C++編程筆記:C語言進制詳解,二進制、八進制和十六進制

我們平時使用的數字都是由 0~9 共十個數字組成的&#xff0c;例如 1、9、10、297、952 等&#xff0c;一個數字最多能表示九&#xff0c;如果要表示十、十一、二十九、一百等&#xff0c;就需要多個數字組合起來。例如表示 58 的結果&#xff0c;一個數字不夠&#xff0c;只能”…

MySQL的索引是什么?怎么優化?

索引類似大學圖書館建書目索引&#xff0c;可以提高數據檢索的效率&#xff0c;降低數據庫的IO成本。MySQL在300萬條記錄左右性能開始逐漸下降&#xff0c;雖然官方文檔說500~800w記錄&#xff0c;所以大數據量建立索引是非常有必要的。MySQL提供了Explain&#xff0c;用于顯示…