99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

101. 對稱二叉樹

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

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

思路

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

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

那么如果比較呢?

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

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

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

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

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

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

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

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

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

遞歸法

遞歸三部曲

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

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

返回值自然是bool類型。

代碼如下:

poYBAGLFR4yAPVqWAAAQuPTXo1A904.jpg

確定終止條件

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

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

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

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

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

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

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

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

代碼如下:

pYYBAGLFR6aAY2QmAABITjMqXUc205.jpg

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

確定單層遞歸的邏輯

此時(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

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

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

poYBAGLFR9-AKoDSAADhGvnLjmI811.jpg

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

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

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

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

pYYBAGLFR_WAakX3AACMdaxuhp0814.jpg

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

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

迭代法

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

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

使用隊(duì)列

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

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

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

代碼如下:

poYBAGLFSBGAefZLAADwW9iQ3gw401.jpg

使用棧

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

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

poYBAGLFSCiAYppNAACr8ADruEI559.jpg

總結(jié)

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

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

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

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

相關(guān)題目推薦

100.相同的樹

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

其他語言版本

Java

pYYBAGLFSF2ADY9uAACr4DprcZA332.jpg

poYBAGLFSG6AKXUhAAEOFGGfMWU626.jpg

poYBAGLFSHaAackKAAD6VGhZVno319.jpg

Python

遞歸法:

poYBAGLFSIyASH4MAADTVj4n-so737.jpg

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

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)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2989

    瀏覽量

    109608
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86723

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

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

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

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

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

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

    什么是默克爾(Merkle Tree)?如何計(jì)算默克爾根?

    01 默克爾的概念 默克爾(Merkle Tree)是一種特殊的二叉樹,它的每個(gè)節(jié)點(diǎn)都存儲了一個(gè)數(shù)據(jù)塊的哈希值。哈希值是一種可以將任意長
    的頭像 發(fā)表于 09-30 18:22 ?2335次閱讀
    什么是默克爾<b class='flag-5'>樹</b>(Merkle Tree)?如何計(jì)算默克爾根?

    紅石比較種模式的作用

    紅石比較器是Minecraft中的一種非常重要的紅石元件,它用于比較兩個(gè)紅石信號的強(qiáng)度,并根據(jù)比較結(jié)果輸出不同的信號強(qiáng)度。比較器有
    的頭像 發(fā)表于 09-05 09:17 ?1671次閱讀

    ad如何設(shè)置兩個(gè)元器件的距離

    在Altium Designer(簡稱AD)中設(shè)置兩個(gè)元器件之間的距離,主要是通過設(shè)置元器件間的安全間距(Clearance)規(guī)則來實(shí)現(xiàn)的。這個(gè)規(guī)則定義了元器件之間、元器件與走線之間以及其他設(shè)計(jì)元素
    的頭像 發(fā)表于 09-02 15:31 ?1.7w次閱讀

    兩個(gè)極管反向串聯(lián)是什么元件

    兩個(gè)極管反向串聯(lián)是一種常見的電路元件,通常被稱為雙向極管或雙向穩(wěn)壓極管。這種元件具有獨(dú)特的電氣特性,可以在正向和反向電壓下工作,廣泛應(yīng)用于各種電子電路中。 一、雙向
    的頭像 發(fā)表于 08-16 16:05 ?7836次閱讀

    極管的伏安特性分為兩個(gè)部分?

    極管是一種半導(dǎo)體器件,具有單向?qū)щ娦?。其伏安特性是描?b class='flag-5'>二極管在不同電壓下電流變化的曲線。極管的伏安特性可以分為兩個(gè)部分:正向特性和反向特性。 正向特性 正向特性是指
    的頭像 發(fā)表于 08-16 11:16 ?1714次閱讀

    觸發(fā)器的兩個(gè)穩(wěn)定狀態(tài)分別是什么

    觸發(fā)器作為數(shù)字電路中的基本邏輯單元,具有兩個(gè)穩(wěn)定狀態(tài),這兩個(gè)狀態(tài)通常用于表示進(jìn)制數(shù)碼中的0和1。
    的頭像 發(fā)表于 08-12 11:01 ?3070次閱讀

    比較兩個(gè)輸入電位,LM393的偏置電壓有什么影響?

    比較兩個(gè)輸入電位的時(shí)候,LM393的偏置電壓有什么影響
    發(fā)表于 08-12 08:28

    使用比較器TLV7041判斷兩個(gè)信號的大小,但輸出未按預(yù)期進(jìn)行是怎么回事?

    我現(xiàn)在需要使用比較判斷兩個(gè)信號的大小,但輸出未按預(yù)期進(jìn)行(不能比較者大小)。如下圖,U17是比較
    發(fā)表于 08-12 08:20

    雙穩(wěn)態(tài)電路的兩個(gè)穩(wěn)定狀態(tài)是什么

    雙穩(wěn)態(tài)電路是一種具有兩個(gè)穩(wěn)定狀態(tài)的電子電路,廣泛應(yīng)用于數(shù)字電路、通信系統(tǒng)、存儲器等領(lǐng)域。 雙穩(wěn)態(tài)電路的基本概念 雙穩(wěn)態(tài)電路是一種具有兩個(gè)穩(wěn)定狀態(tài)的電路,即在沒有外部輸入信號的情況下,電路可以保持在
    的頭像 發(fā)表于 08-11 15:00 ?2642次閱讀

    雙穩(wěn)態(tài)觸發(fā)器的兩個(gè)基本性質(zhì)是什么

    雙穩(wěn)態(tài)觸發(fā)器(Bistable Trigger)是一種具有兩個(gè)穩(wěn)定狀態(tài)的邏輯電路,廣泛應(yīng)用于數(shù)字電路設(shè)計(jì)中。它具有兩個(gè)基本性質(zhì):記憶性和切換性。 一、雙穩(wěn)態(tài)觸發(fā)器的基本概念 1.1 雙穩(wěn)態(tài)觸發(fā)器
    的頭像 發(fā)表于 08-11 10:08 ?1388次閱讀

    節(jié)點(diǎn)電壓法流入節(jié)點(diǎn)電流怎么判斷正負(fù)

    的電壓。在分析過程中,我們需要判斷流入節(jié)點(diǎn)的電流的正負(fù)。 節(jié)點(diǎn)電壓法概述 在節(jié)點(diǎn)電壓法中,我們首先選擇一個(gè)參考
    的頭像 發(fā)表于 08-06 17:24 ?4351次閱讀