原創博客,轉載請注明出處,謝謝~~~
設計二叉樹的循環遍歷算法對於深刻理解二叉樹很有幫助。下面就詳細分析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、中序循環遍歷算法。