精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    2943

    瀏覽量

    104089
  • python
    +關注

    關注

    53

    文章

    4753

    瀏覽量

    84070

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

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

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

    交流元繼電器有兩個線圈

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

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

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

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

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

    堆的實現思路

    什么是堆? 堆是一種 基于樹結構的數據結構,它是一棵二叉樹 ,具有以下兩個特點: 堆是一完全二叉樹,即除了最后一層,其他層都是滿的,最后一層從左到右填滿。 堆中每個
    的頭像 發表于 11-24 16:02 ?331次閱讀
    堆的實現思路

    二叉樹的定義

    型結構 是一類重要的 非線性數據結構 ,其中以二叉樹最為常用,直觀來看,是以分支關系定義的層次結構。型結構在客觀世界中廣泛存在,比
    的頭像 發表于 11-24 15:57 ?1034次閱讀
    <b class='flag-5'>樹</b>與<b class='flag-5'>二叉樹</b>的定義

    什么情況下需要布隆過濾器

    , gmail等郵箱垃圾郵件過濾功能 這幾個例子有一共同的特點:如何判斷元素是否存在一集合中? 常規思路 數組 鏈表 、平衡
    的頭像 發表于 11-11 11:37 ?552次閱讀
    什么情況下需要布隆過濾器

    為什么MySQL索引要用B+tree?

    紅黑是一種特化的 AVL(平衡二叉樹),都是在進行插入和刪除操作時通過特定操作保持二叉查找的平衡; 若一棵
    發表于 10-30 14:41 ?170次閱讀

    芯片外圍電路如何比較兩個不同阻值的大小呢?

    在一些芯片外圍電路中有時需要引腳接不同的阻值以對應不同的功能或狀態,這往往需要比較電阻阻值的大小,類似于電壓比較
    的頭像 發表于 10-29 17:21 ?989次閱讀
    芯片外圍電路如何<b class='flag-5'>比較</b><b class='flag-5'>兩個</b>不同阻值的大小呢?

    Python比較兩個時間序列在圖形上是否相似

    比較兩個時間序列在圖形上是否相似,可以通過以下方法: 可視化比較:將兩個時間序列繪制在同一張圖上,并使用相同的比例和軸標簽進行比較。可以觀察
    的頭像 發表于 10-16 11:33 ?504次閱讀

    文件系統-多二叉樹的轉化

    在這一節中,我們來學習如何使用程序來實現一棵文件。在上一節中,我們了解到使用文件的方式來整合計算機中所有的資源,而這一棵文件則是一棵多
    的頭像 發表于 10-11 10:06 ?768次閱讀
    文件系統-多<b class='flag-5'>叉</b><b class='flag-5'>樹</b>與<b class='flag-5'>二叉樹</b>的轉化

    數據結構面試之二叉樹相關操作

    根據前序可知根結點為1; 根據中序可知 4 7 2 為根結點 1 的左子樹和 8 5 9 3 6 為根結點 1 的右子樹; 遞歸實現,把 4 7 2 當做新的一棵和 8 5 9 3 6 也當做新的一棵; 在遞歸的過程中輸出后序。
    發表于 10-10 14:50 ?182次閱讀
    數據結構面試之<b class='flag-5'>二叉樹</b>相關操作