chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

101. 對稱二叉樹

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

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

思路

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

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

那么如果比較呢?

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

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

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

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

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

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

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

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

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

遞歸法

遞歸三部曲

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

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

返回值自然是bool類型。

代碼如下:

poYBAGLFR4yAPVqWAAAQuPTXo1A904.jpg

確定終止條件

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

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

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

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

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

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

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

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

代碼如下:

pYYBAGLFR6aAY2QmAABITjMqXUc205.jpg

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

確定單層遞歸的邏輯

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

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

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

如果左右都對稱就返回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é)點(diǎn)的左右子樹)是否相互翻轉(zhuǎn),(注意這不是層序遍歷)

使用隊列

通過隊列來判斷根節(jié)點(diǎn)的左子樹和右子樹的內(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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2997

    瀏覽量

    115685
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4858

    瀏覽量

    89588

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

    選擇時間復(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 ?896次閱讀

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

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

    電路板上看到這樣兩個貼片,請教分別是什么元器件

    在一電路板上看到了以下兩個元器件,但不知道是款元器件,麻煩大神給指導(dǎo)! 謝謝!
    發(fā)表于 02-25 21:22

    兩個不同頻率晶振靠的近會怎樣

    晶振的振蕩本質(zhì)上是一種機(jī)械振動(在壓電晶體層面)。當(dāng)兩個晶振靠得很近時,它們的機(jī)械振動可能會相互影響。一晶振的振動可能會通過電路板或者外殼等介質(zhì)傳遞給另一晶振,從而改變另一晶振的
    的頭像 發(fā)表于 01-20 13:55 ?2019次閱讀
    <b class='flag-5'>兩個</b>不同頻率晶振靠的近會怎樣

    求助,以下兩個ADC轉(zhuǎn)換的通道,分別是CC2541上的兩個引腳?。?/a>

    #define HAL_ADC_CHN_TEMP 0x0e /* Temperature sensor */ #define HAL_ADC_CHN_VDD3 0x0f /* VDD/3 */ 以上兩個ADC轉(zhuǎn)換的通道,分別是CC2541上的
    發(fā)表于 01-14 08:15

    如何把兩個數(shù)據(jù)返回給調(diào)用函數(shù)

    函數(shù)的處理結(jié)果包含兩個數(shù)據(jù),如何把兩個數(shù)據(jù)返回給調(diào)用函數(shù)? 第一種,把兩個數(shù)據(jù)封裝成一結(jié)構(gòu)體,函數(shù)返回結(jié)構(gòu)體。 調(diào)用函數(shù)的地方同樣用結(jié)構(gòu)體去接收函數(shù)的返回值。 第
    的頭像 發(fā)表于 01-08 10:15 ?680次閱讀

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-初識設(shè)備之設(shè)備組成和結(jié)構(gòu)

    適配不同的板卡。設(shè)備組成和結(jié)構(gòu)及dts、dtb、dtsi設(shè)備Device Tree由一系列被命名的節(jié)點(diǎn)(node)和屬性(property)組成,而節(jié)點(diǎn)本身可包含子
    發(fā)表于 01-08 08:32

    飛凌嵌入式ElfBoard ELF 1板卡-初識設(shè)備之設(shè)備組成和結(jié)構(gòu)

    適配不同的板卡。設(shè)備組成和結(jié)構(gòu)及dts、dtb、dtsi設(shè)備Device Tree由一系列被命名的節(jié)點(diǎn)(node)和屬性(property)組成,而節(jié)點(diǎn)本身可包含子
    發(fā)表于 01-07 09:16

    西門子TIA Portal如何比較兩個浮點(diǎn)數(shù)相等

    概述: 由于浮點(diǎn)數(shù)的定義規(guī)則,導(dǎo)致浮點(diǎn)數(shù)不能通過進(jìn)制精確表示,所以在浮點(diǎn)數(shù)計算過程中,會出現(xiàn)兩個值一樣的浮點(diǎn)數(shù)進(jìn)行比較相等計算時結(jié)果并不相等的情況。下面先設(shè)計一實例說明該問題,并給
    的頭像 發(fā)表于 01-06 10:07 ?1184次閱讀
    西門子TIA Portal如何<b class='flag-5'>比較</b><b class='flag-5'>兩個</b>浮點(diǎn)數(shù)相等

    DAC8760的Iout和Vout都有兩個TVS防護(hù),這兩個各是什么作用?

    1、DAC8760的Iout和Vout都有兩個TVS防護(hù),這兩個各是什么作用? 2、如果我只希望DAC8760輸出0-5V和4-20mA,輸出電路的兩個TVS都要加么?
    發(fā)表于 12-30 06:49

    通電后兩個比較器LM331芯片發(fā)燙明顯,為什么?

    通電后兩個比較器LM331芯片發(fā)燙明顯,然后U8的1腳及U9的3腳測量電壓只有0.21V不符合理論計算的分壓結(jié)果,I_bat的電壓范圍為在0-3.3V。請問是會是什么原因,謝謝。
    發(fā)表于 12-11 08:31