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

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

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

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

判斷對(duì)稱二叉樹(shù)要比較的是哪兩個(gè)節(jié)點(diǎn)

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

掃碼添加小助手

加入工程師交流群

101. 對(duì)稱二叉樹(shù)

給定一個(gè)二叉樹(shù),檢查它是否是鏡像對(duì)稱的。

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

思路

首先想清楚,判斷對(duì)稱二叉樹(shù)要比較的是哪兩個(gè)節(jié)點(diǎn),要比較的可不是左右節(jié)點(diǎn)!

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

那么如果比較呢?

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

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

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

本題遍歷只能是“后序遍歷”,因?yàn)槲覀円ㄟ^(guò)遞歸函數(shù)的返回值來(lái)判斷兩個(gè)子樹(shù)的內(nèi)側(cè)節(jié)點(diǎn)和外側(cè)節(jié)點(diǎn)是否相等。

正是因?yàn)橐闅v兩棵樹(shù)而且要比較內(nèi)側(cè)和外側(cè)節(jié)點(diǎn),所以準(zhǔn)確的來(lái)說(shuō)是一個(gè)樹(shù)的遍歷順序是左右中,一個(gè)樹(shù)的遍歷順序是右左中。

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

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

說(shuō)到這大家可能感覺(jué)我有點(diǎn)啰嗦,哪有這么多道理,上來(lái)就干就完事了。別急,我說(shuō)的這些在下面的代碼講解中都有身影。

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

遞歸法

遞歸三部曲

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

因?yàn)槲覀円容^的是根節(jié)點(diǎn)的兩個(gè)子樹(shù)是否是相互翻轉(zhuǎn)的,進(jìn)而判斷這個(gè)樹(shù)是不是對(duì)稱樹(shù),所以要比較的是兩個(gè)樹(shù),參數(shù)自然也是左子樹(shù)節(jié)點(diǎn)和右子樹(shù)節(jié)點(diǎn)。

返回值自然是bool類(lèi)型。

代碼如下:

poYBAGLFR4yAPVqWAAAQuPTXo1A904.jpg

確定終止條件

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

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

左節(jié)點(diǎn)為空,右節(jié)點(diǎn)不為空,不對(duì)稱,return false

左不為空,右為空,不對(duì)稱 return false

左右都為空,對(duì)稱,返回true

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

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

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

代碼如下:

pYYBAGLFR6aAY2QmAABITjMqXUc205.jpg

注意上面最后一種情況,我沒(méi)有使用else,而是elseif, 因?yàn)槲覀儼岩陨锨闆r都排除之后,剩下的就是 左右節(jié)點(diǎn)都不為空,且數(shù)值相同的情況。

確定單層遞歸的邏輯

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

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

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

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

代碼如下:

poYBAGLFR8GAek6NAABGcSkJYew381.jpg

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

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

poYBAGLFR9-AKoDSAADhGvnLjmI811.jpg

我給出的代碼并不簡(jiǎn)潔,但是把每一步判斷的邏輯都清楚的描繪出來(lái)了。

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

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

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

pYYBAGLFR_WAakX3AACMdaxuhp0814.jpg

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

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

迭代法

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

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

使用隊(duì)列

通過(guò)隊(duì)列來(lái)判斷根節(jié)點(diǎn)的左子樹(shù)和右子樹(shù)的內(nèi)側(cè)和外側(cè)是否相等,如動(dòng)畫(huà)所示:

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

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

代碼如下:

poYBAGLFSBGAefZLAADwW9iQ3gw401.jpg

使用棧

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

只要把隊(duì)列原封不動(dòng)的改成棧就可以了,我下面也給出了代碼。

poYBAGLFSCiAYppNAACr8ADruEI559.jpg

總結(jié)

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

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

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

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

相關(guān)題目推薦

100.相同的樹(shù)

572.另一個(gè)樹(shù)的子樹(shù)

其他語(yǔ)言版本

Java

pYYBAGLFSF2ADY9uAACr4DprcZA332.jpg

poYBAGLFSG6AKXUhAAEOFGGfMWU626.jpg

poYBAGLFSHaAackKAAD6VGhZVno319.jpg

Python

遞歸法:

poYBAGLFSIyASH4MAADTVj4n-so737.jpg

迭代法:使用隊(duì)列

poYBAGLFSKCAcVZxAADvrTwwIis108.jpg

迭代法:使用棧

poYBAGLFSLaAWPsjAACc4bGIAhg462.jpg





審核編輯:劉清

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

    關(guān)注

    20

    文章

    3001

    瀏覽量

    116411
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4876

    瀏覽量

    90016

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

    兩個(gè)RS485-Modbus主站如何通訊

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

    曙光存儲(chǔ)連續(xù)斬獲兩個(gè)行業(yè)獎(jiǎng)項(xiàng)

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

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

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

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

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

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

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

    通過(guò)優(yōu)化代碼來(lái)提高M(jìn)CU運(yùn)行效率

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

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

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

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

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

    個(gè)硬件SPI兩個(gè)CS操作兩個(gè)norflash,怎么互斥操作兩個(gè)norflash?

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

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

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

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

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

    看到STM8L152用兩個(gè)IO用兩個(gè)或非門(mén)檢測(cè)兩個(gè)通斷,是什么原理呢?

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

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

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

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

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