91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

掃碼添加小助手

加入工程師交流群

101. 對稱二叉樹

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

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

思路

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

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

那么如果比較呢?

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

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

那么遍歷的順序應(yīng)該是什么樣的呢?

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

正是因為要遍歷兩棵樹而且要比較內(nèi)側(cè)和外側(cè)節(jié)點,所以準(zhǔn)確的來說是一個樹的遍歷順序是左右中,一個樹的遍歷順序是右左中。

但都可以理解算是后序遍歷,盡管已經(jīng)不是嚴(yán)格上在一個樹上進(jìn)行遍歷的后序遍歷了。

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

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

那么我們先來看看遞歸法的代碼應(yīng)該怎么寫。

遞歸法

遞歸三部曲

確定遞歸函數(shù)的參數(shù)和返回值

因為我們要比較的是根節(jié)點的兩個子樹是否是相互翻轉(zhuǎn)的,進(jìn)而判斷這個樹是不是對稱樹,所以要比較的是兩個樹,參數(shù)自然也是左子樹節(jié)點和右子樹節(jié)點。

返回值自然是bool類型。

代碼如下:

poYBAGLFR4yAPVqWAAAQuPTXo1A904.jpg

確定終止條件

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

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

左節(jié)點為空,右節(jié)點不為空,不對稱,return false

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

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

此時已經(jīng)排除掉了節(jié)點為空的情況,那么剩下的就是左右節(jié)點不為空:

左右都不為空,比較節(jié)點數(shù)值,不相同就return false

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

代碼如下:

pYYBAGLFR6aAY2QmAABITjMqXUc205.jpg

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

確定單層遞歸的邏輯

此時才進(jìn)入單層遞歸的邏輯,單層遞歸的邏輯就是處理 右節(jié)點都不為空,且數(shù)值相同的情況。

比較二叉樹外側(cè)是否對稱:傳入的是左節(jié)點的左孩子,右節(jié)點的右孩子。

比較內(nèi)測是否對稱,傳入左節(jié)點的右孩子,右節(jié)點的左孩子。

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

代碼如下:

poYBAGLFR8GAek6NAABGcSkJYew381.jpg

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

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

poYBAGLFR9-AKoDSAADhGvnLjmI811.jpg

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

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

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

當(dāng)然我可以把如上代碼整理如下:

pYYBAGLFR_WAakX3AACMdaxuhp0814.jpg

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

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

迭代法

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

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

使用隊列

通過隊列來判斷根節(jié)點的左子樹和右子樹的內(nèi)側(cè)和外側(cè)是否相等,如動畫所示:

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

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

代碼如下:

poYBAGLFSBGAefZLAADwW9iQ3gw401.jpg

使用棧

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

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

poYBAGLFSCiAYppNAACr8ADruEI559.jpg

總結(jié)

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

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

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

如果已經(jīng)做過這道題目的同學(xué),讀完文章可以再去看看這道題目,思考一下,會有不一樣的發(fā)現(xiàn)!

相關(guān)題目推薦

100.相同的樹

572.另一個樹的子樹

其他語言版本

Java

pYYBAGLFSF2ADY9uAACr4DprcZA332.jpg

poYBAGLFSG6AKXUhAAEOFGGfMWU626.jpg

poYBAGLFSHaAackKAAD6VGhZVno319.jpg

Python

遞歸法:

poYBAGLFSIyASH4MAADTVj4n-so737.jpg

迭代法:使用隊列

poYBAGLFSKCAcVZxAADvrTwwIis108.jpg

迭代法:使用棧

poYBAGLFSLaAWPsjAACc4bGIAhg462.jpg





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    3001

    瀏覽量

    116453
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4876

    瀏覽量

    90071

原文標(biāo)題:判斷二叉樹是否對稱

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    深入理解設(shè)備chosen節(jié)點:固件與內(nèi)核的“配置橋梁”

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

    兩個RS485-Modbus主站如何通訊

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

    曙光存儲連續(xù)斬獲兩個行業(yè)獎項

    近期,曙光存儲連續(xù)斬獲兩個行業(yè)獎項,自研技術(shù)產(chǎn)品在國產(chǎn)突破、AI行業(yè)應(yīng)用等方面的成果獲得廣泛關(guān)注。
    的頭像 發(fā)表于 01-15 16:28 ?2520次閱讀

    一文讀懂:直線模組兩個滑塊距離能否調(diào)節(jié)?

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

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

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

    TPSMB非對稱系列TVS極管:汽車應(yīng)用的理想保護(hù)方案

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

    通過優(yōu)化代碼來提高M(jìn)CU運行效率

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

    蜂鳥E203內(nèi)核中斷管理模塊sirv_plic_man代碼分析

    。 上面的代碼生成一二叉樹結(jié)構(gòu)來比較和選擇具有最大優(yōu)先級的掛起中斷源及其ID。樹狀結(jié)構(gòu)由級聯(lián)比較器組成,每一層的比較器數(shù)量是前
    發(fā)表于 10-23 06:05

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

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

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

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

    基本半導(dǎo)體連獲兩個行業(yè)獎項

    近日,基本半導(dǎo)體憑借在碳化硅模塊領(lǐng)域的突出表現(xiàn),連獲“國產(chǎn)SiC模塊TOP企業(yè)獎”和“年度優(yōu)秀功率器件產(chǎn)品獎”兩個行業(yè)獎項。
    的頭像 發(fā)表于 09-05 16:31 ?1098次閱讀

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

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

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

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

    TLV6710 采用集成基準(zhǔn)的低功耗高電壓窗口比較器技術(shù)手冊

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

    TLV6700 采用集成基準(zhǔn)的低功耗窗口比較器技術(shù)手冊

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