色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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)注

    19

    文章

    2966

    瀏覽量

    104704
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4792

    瀏覽量

    84631

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

    觸發(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 ?1054次閱讀

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

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

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

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

    運(yùn)放做比較兩個(gè)輸入相等怎么辦

    ,比較器是運(yùn)放的一種常見應(yīng)用,主要用于比較兩個(gè)模擬信號的大小。 當(dāng)運(yùn)放用作比較器時(shí),其兩個(gè)輸入端分別為非反向輸入端(+)和反向輸入端(-)。
    的頭像 發(fā)表于 07-10 10:34 ?1014次閱讀

    交流元繼電器有兩個(gè)線圈

    交流元繼電器是一種常見的電氣元件,廣泛應(yīng)用于各種電氣控制系統(tǒng)中。它主要由兩個(gè)線圈組成,這兩個(gè)線圈分別是線圈1和線圈2。下面我們將詳細(xì)介紹這兩個(gè)線圈的特點(diǎn)、工作原理以及在實(shí)際應(yīng)用中的注
    的頭像 發(fā)表于 06-29 09:43 ?659次閱讀

    電磁繼電器分為兩個(gè)電路

    的控制。根據(jù)其結(jié)構(gòu)和工作原理,電磁繼電器可以分為兩個(gè)電路:控制電路和工作電路。 一、控制電路 控制電路是電磁繼電器的重要組成部分,它的作用是提供電磁鐵所需的電流,使其產(chǎn)生磁場??刂齐娐分饕呻娫?、控制開關(guān)和
    的頭像 發(fā)表于 06-21 09:28 ?628次閱讀

    請問Stlcr1v1傳感器的溫度是通過兩個(gè)引腳傳出來的?如何讓溫度通過uart兩個(gè)串口傳出來?

    我們想做不聯(lián)電腦手機(jī)機(jī)的單純的單片機(jī)串口通信,不知道我們傳感器的溫度是通過兩個(gè)引腳傳出來的,也不知道怎么樣讓溫度通過uart兩個(gè)串口傳出來。我們還把上面原本的初始程序給覆蓋。有沒有大佬知道溫度是通過哪個(gè)引腳傳出來的?這個(gè)傳感器
    發(fā)表于 06-03 08:53

    兩個(gè)銅片可以形成原電池嗎

    兩個(gè)銅片本身不能形成原電池,因?yàn)樵姵氐墓ぷ髟硪蕾囉?b class='flag-5'>兩個(gè)不同電位的電極材料之間的氧化還原反應(yīng)。
    的頭像 發(fā)表于 05-21 16:23 ?944次閱讀

    arcgis中如何關(guān)聯(lián)兩個(gè)屬性表

    在ArcGIS中,關(guān)聯(lián)兩個(gè)屬性表是一個(gè)重要的操作,可以通過此操作將兩個(gè)表中的數(shù)據(jù)關(guān)聯(lián)起來,以便進(jìn)行分析和查詢。下面是詳細(xì)介紹如何在ArcGIS中實(shí)現(xiàn)屬性表的關(guān)聯(lián)。 首先,我們需要明確兩個(gè)
    的頭像 發(fā)表于 02-25 11:01 ?4191次閱讀

    對稱短路有哪些 對稱短路的形式有四種

    對稱短路有哪些 對稱短路的形式有四種? 對稱短路是指電路中的兩個(gè)電路元件或?qū)Ь€之間有相同的電位差,從而形成電流的直接流動。
    的頭像 發(fā)表于 02-18 10:17 ?2397次閱讀

    Psoc4 4247LQI483如何判斷產(chǎn)生的中斷是由兩個(gè)比較器中的哪一個(gè)輸出的上升沿觸發(fā)的呢?

    LPcomparator的中斷使能時(shí),提示我們使用global signal reference并且選擇LPCompInt。那么,我們?nèi)绾?b class='flag-5'>判斷這個(gè)產(chǎn)生的中斷是由兩個(gè)比較器中的哪一個(gè)輸出
    發(fā)表于 02-18 08:26

    ADuC824正弦波轉(zhuǎn)方波時(shí)頻帶要比較寬時(shí)怎么辦?

    低頻時(shí)轉(zhuǎn)換來的方波的波形單片機(jī)識別不了還是怎么的。有誰遇到過這種問題嗎??有沒有AD芯片低功耗頻帶快的比較器?。??我可以在比較器的輸出端加兩個(gè)對接的穩(wěn)壓管來時(shí)其輸出的方波更好嗎???
    發(fā)表于 01-15 06:42
    主站蜘蛛池模板: 国产精品麻豆高潮刺激A片| 国产精品AV色欲蜜臀在线| 久久精品视在线观看85| 免费毛片视频网站| 王小军怎么了最新消息| 最近2018年手机中文字幕| 国产精品久久vr专区| 日本十八禁无遮拦啪啪漫画| 97免费视频观看| 久久青草免费91线频观看站街 | beeg xxx日本老师| 國産麻豆AVMDMD0179| 性色爽爱性色爽爱网站| 99久久精品费精品国产一区二| 国产精品久久自在自2021| 涩涩爱涩涩电影网站| 囯产精品久久久久久久久蜜桃| 久久精品热线免费| 亚洲一区免费在线观看| 果冻传媒在线播放| 亚洲免费在线观看| 国产WW高清大片免费看| 毛片在线全部免费观看| 亚洲不卡视频在线观看| 国产久久re6免费热在线| 亚洲mv在线观看| 果冻传媒视频在线播放 免费观看| 亚洲成人综合在线| 国拍自产精品福利区| 亚洲免费人成在线视频观看| 狠狠色狠狠色综合日日小说| 桃花论坛POWERED2019| BL文库好大粗黑强强肉NP| 男人的天堂色| S货SAO死你BL大点声叫BL| 巨乳中文无码亚洲| 最近中文字幕高清中文字幕MV| 蜜臀AV浪潮99国产麻豆| 亚洲免费久久| 久久人人爽人人片AV人成| 69丰满少妇AV无码区|