日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

101. 對稱二叉樹

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

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

思路

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

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

那么如果比較呢?

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

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

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

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

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

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

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

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

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

遞歸法

遞歸三部曲

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

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

返回值自然是bool類型。

代碼如下:

poYBAGLFR4yAPVqWAAAQuPTXo1A904.jpg

確定終止條件

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

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

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

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

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

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

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

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

代碼如下:

pYYBAGLFR6aAY2QmAABITjMqXUc205.jpg

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

確定單層遞歸的邏輯

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

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

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

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

代碼如下:

poYBAGLFR8GAek6NAABGcSkJYew381.jpg

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

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

poYBAGLFR9-AKoDSAADhGvnLjmI811.jpg

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

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

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

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

pYYBAGLFR_WAakX3AACMdaxuhp0814.jpg

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

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

迭代法

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

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

使用隊列

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

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

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

代碼如下:

poYBAGLFSBGAefZLAADwW9iQ3gw401.jpg

使用棧

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

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

poYBAGLFSCiAYppNAACr8ADruEI559.jpg

總結

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

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

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

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

相關題目推薦

100.相同的樹

572.另一個樹的子樹

其他語言版本

Java

pYYBAGLFSF2ADY9uAACr4DprcZA332.jpg

poYBAGLFSG6AKXUhAAEOFGGfMWU626.jpg

poYBAGLFSHaAackKAAD6VGhZVno319.jpg

Python

遞歸法:

poYBAGLFSIyASH4MAADTVj4n-so737.jpg

迭代法:使用隊列

poYBAGLFSKCAcVZxAADvrTwwIis108.jpg

迭代法:使用棧

poYBAGLFSLaAWPsjAACc4bGIAhg462.jpg





審核編輯:劉清

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

    關注

    20

    文章

    3012

    瀏覽量

    116873
  • python
    +關注

    關注

    58

    文章

    4889

    瀏覽量

    90328

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    虹科分享 | 如何精準判斷LIN總線從節(jié)點是否在線?

    今天給大家分享一比較實用的方法:如何精準地判斷LIN總線上的從節(jié)點是否與主節(jié)點通訊。也許這時你會覺得奇怪:“我直接用診斷電腦讀取故障碼不就
    的頭像 發(fā)表于 04-16 11:40 ?125次閱讀
    虹科分享 | 如何精準<b class='flag-5'>判斷</b>LIN總線從<b class='flag-5'>節(jié)點</b>是否在線?

    FreeRTOS_SMP_Example_S32K358_2xCores示例配置并實現(xiàn)了一SMP項目,兩個核心的中斷頻率比較高時報故障,怎么解決?

    我參考FreeRTOS_SMP_Example_S32K358_2xCores示例配置并實現(xiàn)了一 SMP 項目。RTD6.0.0但是,當我的兩個核心的中斷頻率比較高時,會出現(xiàn)種故障
    發(fā)表于 03-30 08:23

    圖像上兩個多邊形的ROI區(qū)域,如何獲得這兩個ROI區(qū)域重合部分的ROI

    labview中,圖像上兩個多邊形的ROI區(qū)域,如何獲得這兩個ROI區(qū)域重合部分的ROI
    發(fā)表于 03-16 14:03

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

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

    兩個RS485-Modbus主站如何通訊

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

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

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

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

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

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

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

    通過優(yōu)化代碼來提高MCU運行效率

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

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

    。 上面的代碼生成一二叉樹結構來比較和選擇具有最大優(yōu)先級的掛起中斷源及其ID。樹狀結構由級聯(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

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

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

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

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

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

    圖中兩個按鍵開關是兩個干簧管,為什么不直接對GND設計來檢測這個干簧管通斷呢? 這樣設計的原理是什么?
    發(fā)表于 06-12 06:25
    洪江市| 余江县| 呼和浩特市| 黔南| 诸暨市| 新化县| 南阳市| 蕉岭县| 横峰县| 龙井市| 上栗县| 彩票| 叶城县| 拜城县| 会昌县| 佛坪县| 深州市| 天长市| 双江| 宁乡县| 革吉县| 万盛区| 平江县| 五莲县| 石屏县| 登封市| 商都县| 三明市| 淄博市| 仲巴县| 将乐县| 陆河县| 绥德县| 西丰县| 太原市| 枣庄市| 萝北县| 溧水县| 乌拉特中旗| 新巴尔虎左旗| 修水县|