二叉樹遍歷方法


 

 

 

 

前序遍歷

 

具體過程:

  1. 先訪問根節點
  2. 再序遍歷左子樹
  3. 最后序遍歷右子樹

中序遍歷

 

 

具體過程:

  1. 先中序遍歷左子樹
  2. 再訪問根節點
  3. 最后中序遍歷右子樹

 

后序遍歷

mark

遞歸方式實現后序遍歷

  1. 先后序遍歷左子樹
  2. 再后序遍歷右子樹
  3. 最后訪問根節點
層次遍歷

 二叉樹先序遍歷的實現思想是:

  1. 訪問根節點;
  2. 訪問當前節點的左子樹;
  3. 若當前節點無左子樹,則訪問當前節點的右子樹;

圖 1 二叉樹
 

以圖  1 為例,采用先序遍歷的思想遍歷該二叉樹的過程為:

  1. 訪問該二叉樹的根節點,找到 1;
  2. 訪問節點 1 的左子樹,找到節點 2;
  3. 訪問節點 2 的左子樹,找到節點 4;
  4. 由於訪問節點 4 左子樹失敗,且也沒有右子樹,因此以節點 4 為根節點的子樹遍歷完成。但節點 2 還沒有遍歷其右子樹,因此現在開始遍歷,即訪問節點 5;
  5. 由於節點 5 無左右子樹,因此節點 5 遍歷完成,並且由此以節點 2 為根節點的子樹也遍歷完成。現在回到節點 1 ,並開始遍歷該節點的右子樹,即訪問節點 3;
  6. 訪問節點 3 左子樹,找到節點 6;
  7. 由於節點 6 無左右子樹,因此節點 6 遍歷完成,回到節點 3 並遍歷其右子樹,找到節點 7;
  8. 節點 7 無左右子樹,因此以節點 3 為根節點的子樹遍歷完成,同時回歸節點 1。由於節點 1 的左右子樹全部遍歷完成,因此整個二叉樹遍歷完成;

因此,圖 1 中二叉樹采用先序遍歷得到的序列為:

1 2 4 5 3 6 7

 

二叉樹中序遍歷的實現思想是:

  1. 訪問當前節點的左子樹;
  2. 訪問根節點;
  3. 訪問當前節點的右子樹;

圖 1 二叉樹
 

以圖  1 為例,采用中序遍歷的思想遍歷該二叉樹的過程為:

  1. 訪問該二叉樹的根節點,找到 1;
  2. 遍歷節點 1 的左子樹,找到節點 2;
  3. 遍歷節點 2 的左子樹,找到節點 4;
  4. 由於節點 4 無左孩子,因此找到節點 4,並遍歷節點 4 的右子樹;
  5. 由於節點 4 無右子樹,因此節點 2 的左子樹遍歷完成,訪問節點 2;
  6. 遍歷節點 2 的右子樹,找到節點 5;
  7. 由於節點 5 無左子樹,因此訪問節點 5 ,又因為節點 5 沒有右子樹,因此節點 1 的左子樹遍歷完成,訪問節點 1 ,並遍歷節點 1 的右子樹,找到節點 3;
  8. 遍歷節點 3 的左子樹,找到節點 6;
  9. 由於節點 6 無左子樹,因此訪問節點 6,又因為該節點無右子樹,因此節點 3 的左子樹遍歷完成,開始訪問節點 3 ,並遍歷節點 3 的右子樹,找到節點 7;
  10. 由於節點 7 無左子樹,因此訪問節點 7,又因為該節點無右子樹,因此節點 1 的右子樹遍歷完成,即整棵樹遍歷完成;

因此,圖 1 中二叉樹采用中序遍歷得到的序列為:

4 2 5 1 6 3 7

二叉樹后序遍歷的實現思想是:從根節點出發,依次遍歷各節點的左右子樹,直到當前節點左右子樹遍歷完成后,才訪問該節點元素。



圖 1 二叉樹
 

如圖 1 中,對此二叉樹進行后序遍歷的操作過程為:

  • 從根節點 1 開始,遍歷該節點的左子樹(以節點 2 為根節點);
  • 遍歷節點 2 的左子樹(以節點 4 為根節點);
  • 由於節點 4 既沒有左子樹,也沒有右子樹,此時訪問該節點中的元素 4,並回退到節點 2 ,遍歷節點 2 的右子樹(以 5 為根節點);
  • 由於節點 5 無左右子樹,因此可以訪問節點 5 ,並且此時節點 2 的左右子樹也遍歷完成,因此也可以訪問節點 2;
  • 此時回退到節點 1 ,開始遍歷節點 1 的右子樹(以節點 3 為根節點);
  • 遍歷節點 3 的左子樹(以節點 6 為根節點);
  • 由於節點 6 無左右子樹,因此訪問節點 6,並回退到節點 3,開始遍歷節點 3 的右子樹(以節點 7 為根節點);
  • 由於節點 7 無左右子樹,因此訪問節點 7,並且節點 3 的左右子樹也遍歷完成,可以訪問節點 3;節點 1 的左右子樹也遍歷完成,可以訪問節點 1;
  • 到此,整棵樹的遍歷結束。

由此,對圖 1 中二叉樹進行后序遍歷的結果為:

4 5 2 6 7 3 1

 滿二叉樹:二叉樹中每個內部結點都有存在左子樹和右子樹(或者說滿二叉樹所有的葉結點都有同樣的深度)

滿二叉樹一定是完全二叉樹,但完全二叉樹不一定是滿二叉樹
(滿二叉樹的嚴格的定義是:一顆深度為h且有2h-1個結點的二叉樹)

 

 

  完全二叉樹:
第一種解釋:如果一顆二叉樹除最右邊位置上有一個或幾個葉結點缺少外,其他是豐滿的那么這樣的二叉樹就是完全二叉樹(這句話不太好理解),看下面第二種解釋
第二種解釋:除第h層外,其他各層(1到h-1)的結點數都達到最大個數,第h層從右向左連續缺若干結點,則這個二叉樹就是完全二叉樹
也就是說如果一個結點有右子結點,那么它一定也有左子結點
第三種解釋:除最后一層外,每一層上的節點數均達到最大值,在最后一層上只缺少右邊的若干結點
完全二叉樹的形狀類似於下圖

 

 

為了方便理解請看下圖(個人理解:完全二叉樹就是從上往下填結點,從左往右填,填滿了一層再填下一層)

 

結點的度和層次

對於一個結點,擁有的子樹數(結點有多少分支)稱為結點的度(Degree)。例如,圖 1(A)中,根結點 A 下分出了 3 個子樹,所以,結點 A 的度為 3。

一棵樹的度是樹內各結點的度的最大值。圖 1(A)表示的樹中,各個結點的度的最大值為 3,所以,整棵樹的度的值是 3。

結點的層次:從一棵樹的樹根開始,樹根所在層為第一層,根的孩子結點所在的層為第二層,依次類推。對於圖 1(A)來說,A 結點在第一層,B、C、D 為第二層,E、F、G、H、I、J 在第三層,K、L、M 在第四層。

一棵樹的深度(高度)是樹中結點所在的最大的層次。圖 1(A)樹的深度為 4。

 

樹的表示方法

除了圖 1(A)表示樹的方法外,還有其他表示方法:

 

          (A)                                         (B)
圖2 樹的表示形式
 

圖 2(A)是以嵌套的集合的形式表示的(集合之間絕不能相交,即圖中任意兩個圈不能相交)。

圖 2(B)使用的是凹入表示法(了解即可),表示方式是:最長條為根結點,相同長度的表示在同一層次。例如 B、C、D 長度相同,都為 A 的子結點,E 和 F 長度相同,為 B 的子結點,K 和 L 長度相同,為 E 的子結點,依此類推。

最常用的表示方法是使用廣義表的方式。圖 1(A)用廣義表表示為:

(A , ( B ( E ( K , L ) , F ) , C ( G ) , D ( H ( M ) , I , J ) ) )

 

二叉樹的性質

  1. 二叉樹中,第 i 層最多有 2i-1 個結點。
  2. 如果二叉樹的深度為 K,那么此二叉樹最多有 2K-1 個結點。
  3. 二叉樹中,終端結點數(葉子結點數)為 n0,度為 2 的結點數為 n2,則 n0=n2+1

參考:【圖解數據結構】 二叉樹遍歷


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM