国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

判斷對稱二叉樹要比較的是哪兩個節點

算法與數據結構 ? 來源:代碼隨想錄 ? 作者:程序員Carl ? 2022-07-06 16:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

101. 對稱二叉樹

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

c54bc0e8-fd04-11ec-ba43-dac502259ad0.png

思路

首先想清楚,判斷對稱二叉樹要比較的是哪兩個節點,要比較的可不是左右節點!

對于二叉樹是否對稱,要比較的是根節點的左子樹與右子樹是不是相互翻轉的,理解這一點就知道了其實我們要比較的是兩個樹(這兩個樹是根節點的左右子樹),所以在遞歸遍歷的過程中,也是要同時遍歷兩棵樹。

那么如果比較呢?

比較的是兩個子樹的里側和外側的元素是否相等。如圖所示:

c56013f4-fd04-11ec-ba43-dac502259ad0.png

那么遍歷的順序應該是什么樣的呢?

本題遍歷只能是“后序遍歷”,因為我們要通過遞歸函數的返回值來判斷兩個子樹的內側節點和外側節點是否相等。

正是因為要遍歷兩棵樹而且要比較內側和外側節點,所以準確的來說是一個樹的遍歷順序是左右中,一個樹的遍歷順序是右左中。

但都可以理解算是后序遍歷,盡管已經不是嚴格上在一個樹上進行遍歷的后序遍歷了。

其實后序也可以理解為是一種回溯,當然這是題外話,講回溯的時候會重點講的。

說到這大家可能感覺我有點啰嗦,哪有這么多道理,上來就干就完事了。別急,我說的這些在下面的代碼講解中都有身影。

那么我們先來看看遞歸法的代碼應該怎么寫。

遞歸法

遞歸三部曲

確定遞歸函數的參數和返回值

因為我們要比較的是根節點的兩個子樹是否是相互翻轉的,進而判斷這個樹是不是對稱樹,所以要比較的是兩個樹,參數自然也是左子樹節點和右子樹節點。

返回值自然是bool類型。

代碼如下:

poYBAGLFR4yAPVqWAAAQuPTXo1A904.jpg

確定終止條件

要比較兩個節點數值相不相同,首先要把兩個節點為空的情況弄清楚!否則后面比較數值的時候就會操作空指針了。

節點為空的情況有:(注意我們比較的其實不是左孩子和右孩子,所以如下我稱之為左節點右節點)

左節點為空,右節點不為空,不對稱,return false

左不為空,右為空,不對稱 return false

左右都為空,對稱,返回true

此時已經排除掉了節點為空的情況,那么剩下的就是左右節點不為空:

左右都不為空,比較節點數值,不相同就return false

此時左右節點不為空,且數值也不相同的情況我們也處理了。

代碼如下:

pYYBAGLFR6aAY2QmAABITjMqXUc205.jpg

注意上面最后一種情況,我沒有使用else,而是elseif, 因為我們把以上情況都排除之后,剩下的就是 左右節點都不為空,且數值相同的情況。

確定單層遞歸的邏輯

此時才進入單層遞歸的邏輯,單層遞歸的邏輯就是處理 右節點都不為空,且數值相同的情況。

比較二叉樹外側是否對稱:傳入的是左節點的左孩子,右節點的右孩子。

比較內測是否對稱,傳入左節點的右孩子,右節點的左孩子。

如果左右都對稱就返回true ,有一側不對稱就返回false 。

代碼如下:

poYBAGLFR8GAek6NAABGcSkJYew381.jpg

如上代碼中,我們可以看出使用的遍歷方式,左子樹左右中,右子樹右左中,所以我把這個遍歷順序也稱之為“后序遍歷”(盡管不是嚴格的后序遍歷)。

最后遞歸的C++整體代碼如下:

poYBAGLFR9-AKoDSAADhGvnLjmI811.jpg

我給出的代碼并不簡潔,但是把每一步判斷的邏輯都清楚的描繪出來了。

如果上來就看網上各種簡潔的代碼,看起來真的很簡單,但是很多邏輯都掩蓋掉了,而題解可能也沒有把掩蓋掉的邏輯說清楚。

盲目的照著抄,結果就是:發現這是一道“簡單題”,稀里糊涂的就過了,但是真正的每一步判斷邏輯未必想到清楚。

當然我可以把如上代碼整理如下:

pYYBAGLFR_WAakX3AACMdaxuhp0814.jpg

這個代碼就很簡潔了,但隱藏了很多邏輯,條理不清晰,而且遞歸三部曲,在這里完全體現不出來。

所以建議大家做題的時候,一定要想清楚邏輯,每一步做什么。把道題目所有情況想到位,相應的代碼寫出來之后,再去追求簡潔代碼的效果。

迭代法

這道題目我們也可以使用迭代法,但要注意,這里的迭代法可不是前中后序的迭代寫法,因為本題的本質是判斷兩個樹是否是相互翻轉的,其實已經不是所謂二叉樹遍歷的前中后序的關系了。

這里我們可以使用隊列來比較兩個樹(根節點的左右子樹)是否相互翻轉,(注意這不是層序遍歷)

使用隊列

通過隊列來判斷根節點的左子樹和右子樹的內側和外側是否相等,如動畫所示:

c575382e-fd04-11ec-ba43-dac502259ad0.gif

如下的條件判斷和遞歸的邏輯是一樣的。

代碼如下:

poYBAGLFSBGAefZLAADwW9iQ3gw401.jpg

使用棧

細心的話,其實可以發現,這個迭代法,其實是把左右兩個子樹要比較的元素順序放進一個容器,然后成對成對的取出來進行比較,那么其實使用棧也是可以的。

只要把隊列原封不動的改成棧就可以了,我下面也給出了代碼。

poYBAGLFSCiAYppNAACr8ADruEI559.jpg

總結

這次我們又深度剖析了一道二叉樹的“簡單題”,大家會發現,真正的把題目搞清楚其實并不簡單,leetcode上accept了和真正掌握了還是有距離的。

我們介紹了遞歸法和迭代法,遞歸依然通過遞歸三部曲來解決了這道題目,如果只看精簡的代碼根本看不出來遞歸三部曲是如果解題的。

在迭代法中我們使用了隊列,需要注意的是這不是層序遍歷,而且僅僅通過一個容器來成對的存放我們要比較的元素,知道這一本質之后就發現,用隊列,用棧,甚至用數組,都是可以的。

如果已經做過這道題目的同學,讀完文章可以再去看看這道題目,思考一下,會有不一樣的發現!

相關題目推薦

100.相同的樹

572.另一個樹的子樹

其他語言版本

Java

pYYBAGLFSF2ADY9uAACr4DprcZA332.jpg

poYBAGLFSG6AKXUhAAEOFGGfMWU626.jpg

poYBAGLFSHaAackKAAD6VGhZVno319.jpg

Python

遞歸法:

poYBAGLFSIyASH4MAADTVj4n-so737.jpg

迭代法:使用隊列

poYBAGLFSKCAcVZxAADvrTwwIis108.jpg

迭代法:使用棧

poYBAGLFSLaAWPsjAACc4bGIAhg462.jpg





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    3001

    瀏覽量

    116422
  • python
    +關注

    關注

    57

    文章

    4876

    瀏覽量

    90025

原文標題:判斷二叉樹是否對稱

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    深入理解設備chosen節點:固件與內核的“配置橋梁”

    在嵌入式 Linux 開發中,設備(Device Tree)是連接硬件與內核的關鍵紐帶。但有一節點很特殊 —— 它不描述任何硬件模塊,卻直接決定內核能否正常啟動,這就是chosen節點
    的頭像 發表于 02-09 16:36 ?135次閱讀
    深入理解設備<b class='flag-5'>樹</b>chosen<b class='flag-5'>節點</b>:固件與內核的“配置橋梁”

    兩個RS485-Modbus主站如何通訊

    本產品能很好解決Master-1主站向模塊寫入數據,Master-2主站讀取數據;Master-2主站向模塊寫入數據,Master-1主站讀取數據。由此解決兩個主站之間的互相讀通信難題。
    發表于 02-08 15:32 ?0次下載

    曙光存儲連續斬獲兩個行業獎項

    近期,曙光存儲連續斬獲兩個行業獎項,自研技術產品在國產突破、AI行業應用等方面的成果獲得廣泛關注。
    的頭像 發表于 01-15 16:28 ?2485次閱讀

    一文讀懂:直線模組兩個滑塊距離能否調節?

    關鍵問題:直線模組中的兩個滑塊距離可以調節嗎?答案并非絕對,而是要根據直線模組的具體類型、結構設計來綜合判斷,不同類型的直線模組在滑塊距離調節上有著截然不同的特性。?飛
    的頭像 發表于 12-29 15:47 ?237次閱讀
    一文讀懂:直線模組<b class='flag-5'>兩個</b>滑塊距離能否調節?

    深入解析SMFA非對稱系列表面貼裝TVS極管

    深入解析SMFA非對稱系列表面貼裝TVS極管 在電子設備的設計中,保護關鍵元件免受電壓瞬變和浪涌的影響至關重要。TVS(瞬態電壓抑制)極管作為一種常用的保護器件,能夠在瞬間吸收大量的能量,將電壓
    的頭像 發表于 12-15 16:40 ?376次閱讀

    TPSMB非對稱系列TVS極管:汽車應用的理想保護方案

    TPSMB非對稱系列TVS極管:汽車應用的理想保護方案 在汽車電子領域,隨著電動汽車的快速發展,對電子元件的性能和可靠性提出了更高的要求。TVS(瞬態電壓抑制)極管作為一種重要的過電壓保護元件
    的頭像 發表于 12-15 16:20 ?469次閱讀

    通過優化代碼來提高MCU運行效率

    選擇時間復雜度低的算法。 根據訪問模式選擇數據結構。頻繁查找用哈希表,有序數據用二叉樹等。 查表法:對于復雜的數學計算(如sin, log),或者協議解析,預先計算好結果存于數組中,用空間換時間
    發表于 11-12 08:21

    蜂鳥E203內核中斷管理模塊sirv_plic_man代碼分析

    。 上面的代碼生成一二叉樹結構來比較和選擇具有最大優先級的掛起中斷源及其ID。樹狀結構由級聯比較器組成,每一層的比較器數量是前
    發表于 10-23 06:05

    兩個模擬SPI,只有第二個正常,為什么?

    兩個模擬SPI,一用于VS1003,另一用于SPI模式的SD卡。只有第二個SPI可以正常使用, static struct stm32_soft_spi_config
    發表于 09-29 07:19

    硬件SPI兩個CS操作兩個norflash,怎么互斥操作兩個norflash?

    硬件SPI兩個CS操作兩個norflash,怎么互斥操作兩個norflash,有一norflash被模擬成U盤,會在中斷中操作spi。
    發表于 09-26 06:18

    基本半導體連獲兩個行業獎項

    近日,基本半導體憑借在碳化硅模塊領域的突出表現,連獲“國產SiC模塊TOP企業獎”和“年度優秀功率器件產品獎”兩個行業獎項。
    的頭像 發表于 09-05 16:31 ?1095次閱讀

    圖中兩個按鍵開關是兩個干簧管,為什么不直接對GND設計來檢測這個干簧管通斷呢?

    圖中兩個按鍵開關是兩個干簧管,為什么不直接對GND設計來檢測這個干簧管通斷呢? 這樣設計的原理是什么?
    發表于 06-17 06:30

    看到STM8L152用兩個IO用兩個或非門檢測兩個通斷,是什么原理呢?

    圖中兩個按鍵開關是兩個干簧管,為什么不直接對GND設計來檢測這個干簧管通斷呢? 這樣設計的原理是什么?
    發表于 06-12 06:25

    TLV6710 采用集成基準的低功耗高電壓窗口比較器技術手冊

    TLV6710 是一款高電壓窗口比較器,工作電壓范圍為 1.8V 至 36V。此器件具有兩個內部基準電壓為 400mV 的高精度比較器和兩個額定電壓為 25V 的開漏輸出TLV6710
    的頭像 發表于 04-18 09:54 ?1037次閱讀
    TLV6710 采用集成基準的低功耗高電壓窗口<b class='flag-5'>比較</b>器技術手冊

    TLV6700 采用集成基準的低功耗窗口比較器技術手冊

    TLV6700 是一工作電壓范圍為 1.8V 至 18V 的高電壓窗口比較器。該器件擁有兩個內部基準電壓為 400mV 的高精度比較器和兩個
    的頭像 發表于 04-18 09:39 ?898次閱讀
    TLV6700 采用集成基準的低功耗窗口<b class='flag-5'>比較</b>器技術手冊