樹的層次遍歷


       說到樹的層次遍歷,就應該提到廣度優先搜索算法------廣度優先搜索算法(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();    
        }
}

另外還寫了樹的三種深度優先遍歷的遞歸與非遞歸算法:

http://www.cnblogs.com/LZYY/p/3454778.html


免責聲明!

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



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