二叉樹及其先序、中序、後序遍歷

本節內容:

  • 二叉樹定義
  • 完全二叉樹
  • 滿二叉樹
  • 先序、中序、後序遍歷
  • 已知先序遍歷、中序遍歷求後序遍歷
  • 已知中序遍歷、後序遍歷求先序遍歷

二叉樹定義

這裏寫圖片描述
二叉樹:二叉樹是每個節點最多隻有兩個分支(不存在分支度大於2的節點)的樹結構。通常分支被稱作“左子樹”和“右子樹”。二叉樹的分支具有左右次序,不能顛倒。
節點:樹的每個元素都是一個節點。(上圖有9個節點)
根節點:沒有父節點的節點。(8爲根節點)
葉節點:沒有子節點的節點。(1,4,7,13都是葉節點)
深度:(這就很煩了,不同地方的定義有所不同,維基百科上定義根節點的深度爲0,其他很多地方定義根節點深度爲1,這裏採用樹的深度從1開始)從根節點爲 1 開始,樹中結點最大層次的值就是樹的深度。上圖樹的深度爲4。
:節點的子節點個數爲節點的度。所有節點最大的度就是樹的度。二叉樹的度最大爲2。

完全二叉樹和滿二叉樹

學習最困難的地方不在於知識到底有多難,最特麼難的地方就是各個地方標準和定義都不一樣。完全二叉樹和滿二叉樹在各個地方的定義就有所不同,但是這兩種樹又比較重要,所以還是說一說。

這裏寫圖片描述

滿二叉樹(full Binary Tree):樹上所有的節點,要麼是葉節點,要麼有兩個子節點。(除了葉節點外所有節點都有兩個子節點的樹就是滿二叉樹)
完全二叉樹(Complete Binary Tree):除了最後一層外,其他各層都是滿的,最下面一層的結點都集中在該層最左邊的若干位置。

先序、中序、後序遍歷

先序遍歷:先根、再左、後右
中序遍歷:先左、再根、後右
後續遍歷:先左、再右、後根

這裏寫圖片描述
先說答案:
先序遍歷:ABCDFEGHIJKLM
中序遍歷:CFDEBGJILMKHA
後序遍歷:FEDCJMLKIHGBA

看待這裏是不是一臉懵逼?是不是發現自己就像個智障?發現除了先序遍歷以外自己啥都不會?沒錯,我開始也是這樣的,網上找了一堆資料,全都是上面那樣介紹的,什麼左根右,什麼左右根,啥玩意,怎麼一會C下一步就跑到J上面去了?

沒關係,我保證你看完下面的,絕對能輕鬆掌握先序、中序、後序遍歷。隨便給你你個二叉樹,分分鐘給它遍歷咯。

來,我們先加上兩個字,加完以後你就能理解一半了。

——遞歸

三種遍歷都是從二叉樹的根節點開始的。
三種遍歷都是從二叉樹的根節點開始的。
三種遍歷都是從二叉樹的根節點開始的。

沒錯,就是從根節點開始的。以中序遍歷爲例,我們來看看上圖到底是怎麼遍歷的。還記得中序遍歷的遍歷規則麼,先左、再根、後右。

開始啦!從根節點A開始,按順序左根右,也就是‘BA空’,因爲根節點A沒有右的子節點嘛。也就是B在A的前面,那是不是中序遍歷最開始就是B了呢?NO!!!還記得前面的遞歸二字麼,到B之後遞歸就開始啦。此時以B爲根節點,繼續往下走,按中序遍歷的規則——左根右,也就是CBG。看到沒,C在B的前面,以C爲根節點繼續遞歸。那麼啥時候遞歸結束了呢?當然就是遞歸不下去了就可以輸出節點啦。這裏以C爲根節點,按順序左根右就是‘空CD’了,已經沒有節點可以排在C之前了,所以輸出C,那既然按‘空CD’的順序,那C後面是不是就是D了呢?NO!!!因爲D也要往下走啊,以D爲根節點那就是‘FDE’這樣的順序了。顯然這裏F和E已經到了葉節點了,不能再往下了,所以這一塊的順序就是CFDE了。E輸出完了之後呢?之後是不是又懵逼了?還記得之前停在哪麼?對,就是CBG,B是根節點,CDEF這四個當做一個整體,這個整體就看做是B的左子節點,左邊輸出完了,按順序就到跟節點B啦,把B右側所有的看成一個整體。接着就到了右了。
現在以G作爲根節點,‘左根右’就是‘空GH’啦,H之後的都排在G之後,而G左邊的沒有了,所以這裏要輸出G。到這裏我們已有CFDEBG了。後面都是同樣的道理,H的下左邊是I,I的下左邊是J,沒有什麼能排在J之前了,所以輸出J。
到這之後我就不細說了。最後就能得到CFDEBGJILMKHA。

總之,記住遞歸二字,還有就是將某節點之後的所有節點當做一個整體來看,差不多算是一棵子樹吧。
看到這裏,應該都能懂吧。大家可以以上圖爲例,進行一下後序遍歷,就當是練習了。

已知中序遍歷、後序遍歷求先序遍歷

最最經典的來啦,會這個不能說是理解二叉樹了,但是不會這個一定不敢說自己理解二叉樹。
已知中序遍歷,先序遍歷和後序遍歷兩者知其一,就能求出另一個了。
還是以上面的圖爲例吧,不,這次就當這個圖不存在,我們已知:

中序遍歷:CFDEBGJILMKHA
後序遍歷:FEDCJMLKIHGBA

現在來求先序遍歷。

別急,其實根本不難,理解之後就超級簡單的。

先回憶下遍歷規則:

中序遍歷:先左、再根、後右
後續遍歷:先左、再右、後根

好啦,開始啦。
1.先看後序遍歷,先左、再右、後根,所以A一定是根節點,且是整棵樹的根節點。這樣A的位置就確定啦。
2.再在中序遍歷序列中找到根節點A,我們知道中序遍歷:先左、再根、後右。以根節點爲中心,根節點左側的當做一個整體,根節點右側的也當做一個整體。這裏的話CFDEBGJILMKH是一個整體,全部在A的左側,而A的右側沒有元素,也就是沒有右子樹。
3.再回頭看看後序遍歷序列FEDCJMLKIHGBA,A是根節點且沒有右子樹,所以B一定就是A的左子樹根節點啦。這樣B的位置就確定了。
4.現在以B爲根節點,在中序遍歷序列中找到B的位置,B的左側看成一個整體,CFDE全在B的左邊。B的右側看成一個整體,GJILMKH全在右邊。我們先來看看左邊的CFDE這幾個是個啥結構?只盯着這幾個是看不出來滴。在後序遍歷裏面找找這幾個的相對位置,發現剛好在一起,順序是FEDC。顯然C是這四個元素的根節點。同樣的,按之前的規律,在中序遍歷序列中以根節點爲中心,根節點兩邊的就是左右子樹。發現C沒有左子樹,FDE都在右邊。後序裏面是FED所以D是這三個元素的根節點,F就是左子節點,E就是右子節點。

到這裏能得到以下這個結果了(原諒我,我們靈魂畫手都這樣)
這裏寫圖片描述

右邊的那一部分我就不畫了,怕辣到大家眼睛。總之,通過後序遍歷和前序遍歷都能找到根節點,通過中序遍歷能分開左右子樹,結合二者就能還原出二叉樹了,自然就能通過二者求小三了。但是二者之中必須要有中序遍歷。

以上,全文完。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章