說到樹的層次遍歷,就應該提到廣度優先搜索算法------廣度優先搜索算法(Breadth-First-Search),又譯作寬度優先搜索,或橫向優先搜索,簡稱BFS,是一種圖形搜索算法。
可以說樹層次遍歷是廣度優先遍歷的一種直接應用吧,比較廣度優先搜索是圖形的一種搜索算法,圖形是一種比較大的概念,但這個和深度優先齊名的算法,在樹的層次遍歷引用中,並沒有那么復雜,或許是因為用在樹的遍歷,而非圖吧。
樹的層次遍歷,故名思議,在一棵樹中,把節點從左往右,一層一層的,從上往下,遍歷輸出,這里要用到一種很重要的數據結構,隊列,一提到隊列,我們就要想到先進先進先,即為先進入隊列元素,先接受處理,我們在日常生活中排隊時,就是先到的人,先接受服務。
理解好隊列,可以很容易的解決樹的層此遍歷,步驟如下:
1.首先將根節點放入隊列中。
2.當隊列為非空時,循環執行步驟3到步驟5,否則執行6;
3.出隊列取得一個結點,訪問該結點;
4.若該結點的左子樹為非空,則將該結點的左子樹入隊列;
5.若該結點的右子樹為非空,則將該結點的右子樹入隊列;
6.結束。
代碼:
/***************************************
* 時間:2013年12月2日
* author:lm
* 內容:二叉樹的層次遍歷
***************************************/
import java.util.ArrayDeque;
import java.util.Queue;
public class BinTree { private char date; private BinTree lchild; //左孩子 private BinTree rchild; //右孩子 private BinTree(char c ){ date = c; } public static void BFSOrder(BinTree t) { if(t==null) return ; Queue<BinTree> queue = new ArrayDeque<BinTree>(); //隊列小知識:使用offer和poll優於add和remove之處在於它們返回值可以判斷成功與否,而不拋出異常 queue.offer(t); //進入隊列 while(!queue.isEmpty()) { t=queue.poll(); //當前節點出隊列 System.out.print(t.date); if(t.lchild!=null) //當前節點左孩子去排隊,在前面哦 queue.offer(t.lchild); if(t.rchild!=null) //右孩子排第二 queue.offer(t.rchild); } } public static void main(String[] args) { BinTree b1 = new BinTree('a'); BinTree b2 = new BinTree('b'); BinTree b3 = new BinTree('c'); BinTree b4 = new BinTree('d'); BinTree b5 = new BinTree('e'); BinTree b6 = new BinTree('f'); BinTree b7 = new BinTree('g'); /** * a * / \ * b c * / \ / \ * d e f g */ b1.lchild = b2; b1.rchild = b3; b2.lchild = b4; b2.rchild = b5; b3.lchild = b6; b3.rchild = b7; BinTree.BFSOrder(b1); System.out.println(); } }
另外還寫了樹的三種深度優先遍歷的遞歸與非遞歸算法:
