在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

算法與數據結構 ? 來源:代碼隨想錄 ? 作者:程序員Carl ? 2022-07-06 16:26 ? 次閱讀

101. 對稱二叉樹

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

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

思路

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

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

那么如果比較呢?

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

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

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

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

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

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

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

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

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

遞歸法

遞歸三部曲

確定遞歸函數的參數和返回值

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

返回值自然是bool類型。

代碼如下:

poYBAGLFR4yAPVqWAAAQuPTXo1A904.jpg

確定終止條件

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

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

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

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

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

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

左右都不為空,比較節點數值,不相同就return false

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

代碼如下:

pYYBAGLFR6aAY2QmAABITjMqXUc205.jpg

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

確定單層遞歸的邏輯

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

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

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

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

代碼如下:

poYBAGLFR8GAek6NAABGcSkJYew381.jpg

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

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

poYBAGLFR9-AKoDSAADhGvnLjmI811.jpg

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

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

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

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

pYYBAGLFR_WAakX3AACMdaxuhp0814.jpg

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

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

迭代法

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

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

使用隊列

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

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

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

代碼如下:

poYBAGLFSBGAefZLAADwW9iQ3gw401.jpg

使用棧

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

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

poYBAGLFSCiAYppNAACr8ADruEI559.jpg

總結

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

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

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

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

相關題目推薦

100.相同的樹

572.另一個樹的子樹

其他語言版本

Java

pYYBAGLFSF2ADY9uAACr4DprcZA332.jpg

poYBAGLFSG6AKXUhAAEOFGGfMWU626.jpg

poYBAGLFSHaAackKAAD6VGhZVno319.jpg

Python

遞歸法:

poYBAGLFSIyASH4MAADTVj4n-so737.jpg

迭代法:使用隊列

poYBAGLFSKCAcVZxAADvrTwwIis108.jpg

迭代法:使用棧

poYBAGLFSLaAWPsjAACc4bGIAhg462.jpg





審核編輯:劉清

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

    關注

    19

    文章

    2967

    瀏覽量

    104758
  • python
    +關注

    關注

    56

    文章

    4797

    瀏覽量

    84691

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    兩個極管反向串聯是什么元件

    兩個極管反向串聯是一種常見的電路元件,通常被稱為雙向極管或雙向穩壓極管。這種元件具有獨特的電氣特性,可以在正向和反向電壓下工作,廣泛應用于各種電子電路中。 一、雙向
    的頭像 發表于 08-16 16:05 ?3257次閱讀

    極管的伏安特性分為兩個部分?

    極管是一種半導體器件,具有單向導電性。其伏安特性是描述極管在不同電壓下電流變化的曲線。極管的伏安特性可以分為兩個部分:正向特性和反向特性。 正向特性 正向特性是指
    的頭像 發表于 08-16 11:16 ?850次閱讀

    觸發器的兩個穩定狀態分別是什么

    觸發器作為數字電路中的基本邏輯單元,具有兩個穩定狀態,這兩個狀態通常用于表示進制數碼中的0和1。
    的頭像 發表于 08-12 11:01 ?1185次閱讀

    使用比較器TLV7041判斷兩個信號的大小,但輸出未按預期進行是怎么回事?

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

    節點電壓法流入節點電流怎么判斷正負

    的電壓。在分析過程中,我們需要判斷流入節點的電流的正負。 節點電壓法概述 在節點電壓法中,我們首先選擇一參考
    的頭像 發表于 08-06 17:24 ?2197次閱讀

    運放做比較兩個輸入相等怎么辦

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

    交流元繼電器有兩個線圈

    交流元繼電器是一種常見的電氣元件,廣泛應用于各種電氣控制系統中。它主要由兩個線圈組成,這兩個線圈分別是線圈1和線圈2。下面我們將詳細介紹這兩個線圈的特點、工作原理以及在實際應用中的注
    的頭像 發表于 06-29 09:43 ?684次閱讀

    電磁繼電器分為兩個電路

    的控制。根據其結構和工作原理,電磁繼電器可以分為兩個電路:控制電路和工作電路。 一、控制電路 控制電路是電磁繼電器的重要組成部分,它的作用是提供電磁鐵所需的電流,使其產生磁場。控制電路主要由電源、控制開關和
    的頭像 發表于 06-21 09:28 ?666次閱讀

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

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

    兩個銅片可以形成原電池嗎

    兩個銅片本身不能形成原電池,因為原電池的工作原理依賴于兩個不同電位的電極材料之間的氧化還原反應。
    的頭像 發表于 05-21 16:23 ?970次閱讀

    arcgis中如何關聯兩個屬性表

    在ArcGIS中,關聯兩個屬性表是一重要的操作,可以通過此操作將兩個表中的數據關聯起來,以便進行分析和查詢。下面是詳細介紹如何在ArcGIS中實現屬性表的關聯。 首先,我們需要明確兩個
    的頭像 發表于 02-25 11:01 ?4241次閱讀

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

    對稱短路有哪些 對稱短路的形式有四種? 對稱短路是指電路中的兩個電路元件或導線之間有相同的電位差,從而形成電流的直接流動。
    的頭像 發表于 02-18 10:17 ?2469次閱讀

    Psoc4 4247LQI483如何判斷產生的中斷是由兩個比較器中的哪一輸出的上升沿觸發的呢?

    LPcomparator的中斷使能時,提示我們使用global signal reference并且選擇LPCompInt。那么,我們如何判斷這個產生的中斷是由兩個比較器中的哪一輸出
    發表于 02-18 08:26

    ADuC824正弦波轉方波時頻帶要比較寬時怎么辦?

    低頻時轉換來的方波的波形單片機識別不了還是怎么的。有誰遇到過這種問題嗎??有沒有AD芯片低功耗頻帶快的比較器啊??我可以在比較器的輸出端加兩個對接的穩壓管來時其輸出的方波更好嗎???
    發表于 01-15 06:42
    主站蜘蛛池模板: 又粗又硬又猛又黄的免费视频黑人| 亚洲精品久| 色女人在线| 国产亚洲精品在天天在线麻豆| 国产色视频一区| 久久作爱视频| 欧美成人性色区| 五月婷婷激情网| 天堂中文字幕| 免费的黄色大片| 天天视频国产免费入口| 国产一区二区三区波多野吉衣| 免费日本视频| 四虎精品永久在线| www.黄色免费| 久久综合视频网| 最新版天堂中文在线官网| 色视频欧美| 午夜视频在线观看免费高清| 久久天天躁狠狠躁夜夜呲| 高清一区二区三区免费| 日韩伦| 国产精品漂亮美女在线观看| 日本黄色美女网站| 成 人 在 线 免费 8888 www| 久久久综合色| 午夜国产精品免费观看| 视频在线观看免费网站| 亚洲ol| 一级精品视频| 欧美系列在线观看| 日本三级免费网站| 亚洲第一久久| 久久99热久久精品动漫| 国产美女在线观看| 国内久久久久高清影视| 婷婷丁香色| 天天插综合网| 欧美性色xo影院69| 国产性片在线| 亚1洲二区三区四区免费|