3、二叉樹:先序,中序,后序循環遍歷詳解


原創博客,轉載請注明出處,謝謝~~~


 

  

設計二叉樹的循環遍歷算法對於深刻理解二叉樹很有幫助。下面就詳細分析3個循環遍歷算法。

1、先序循環遍歷算法

在自己設計循環遍歷算法的時候,感覺先序遍歷算法設計最為容易。下面把設計思路寫下來,以防遺忘。

 

先序循環遍歷二叉樹的思路最為直接,規則就是

①. 從根結點開始沿着左孩子一直走到頭,在此過程中,每到達一個結點便訪問其元素值(如,輸出),同時檢測該結點是否有右孩子,如果有則將指向右孩子的引用入棧;

②. 第一步完成以后,彈出一個棧頂引用作為本次循環的根節點,並重復步驟①,直到棧為空;

 

例如上圖:

1. 從根節點A開始,輸出A的元素值。同時,A有右孩子F,所以將A.rchild入棧,即:stack.push(A.rchild)。

2. 沿A左孩子走到B,輸出B的元素值,同時B有右孩子D,所以將B.rchild入棧。

3. 沿B的左孩子走到C,輸出C的元素值,C沒有右孩子了,說明此次以A作為根節點的循環結束。

4. 接着檢測堆棧。如果堆棧不為空,彈出一個值作為根節點重復1~4步驟;如果堆棧為空,則遍歷結束。

 

再從圖上面形象的理解遍歷過程:總是從右上到左下依次進行。如圖中標注為“1”、“2”、“3”、“4”的紅色線條。

依據上面的理解,不難寫出先序循環遍歷的代碼:

 1 /**
 2      * 先序循環遍歷法。
 3      * @return true 表示完全遍歷;<br>false 表示滿足條件終止遍歷;
 4      */
 5 public boolean preOrderCircleTraverse(){
 6     if(root == null)
 7         return true;
 8         
 9     Stack<Node> stack = new Stack<>();
10     stack.push(root);
11     Node nod = null;
12         
13     while(!stack.empty()){//開始下一次從右上到左下的循環
14         nod = stack.pop();
15         while(nod != null){
16             if(!visitElem(nod))//訪問結點的元素
17                 return false;
18             if(nod.getRchild() != null)//有右孩子,就入棧
19                 stack.push(nod.getRchild());
20             nod = nod.getLchild();
21         }
22     }
23     return true;
24 }        

 

2、中序循環遍歷算法。

 


免責聲明!

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



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