算法思想
用一個佇列保存被訪問的當前節點的左右孩子以實現層序遍歷。
在進行層次遍歷的時候,設定一個佇列結構,遍歷從二叉樹的根節點開始,首先將根節點指針入佇列,然後從隊頭取出一個元素,每取一個元素,執行下面兩個操作:
1、訪問該元素所指向的節點
2、若該元素所指節點的左右孩子節點非空,則將該元素所指節點的左孩子指針和右孩子指針順序入隊。此過程不斷進行,當佇列為空時,二叉樹的層次遍歷結束。
實現
Java語言
C++語言
由於遍歷中所使用的數據結構是一個佇列而不是棧,因此寫一個按層遍歷的遞歸程式很困難。如下程式用來對二叉樹進行逐層遍歷,它採用了佇列數據結構。佇列中的元素指向二叉樹節點。當然,也可以採用公式化佇列。
程式中,僅當樹非空時,才進入w h i l e循環。首先訪問根節點,然後把其子節點加到佇列中。當佇列添加操作失敗時,由Add引發NoMem異常,由於沒有捕獲該異常,因此當異常發生時LevelOrder函式將退出。在把t的子節點加入佇列後,要從佇列中刪除t元素。若佇列為空,則由Delete引發OutOfBounds異常,這由catch語句來處理。因為一個空佇列意味著遍歷的結束,所以執行return語句。若佇列非空,則Delete把所刪除的元素返回至變數t。被刪除的元素指向下一個欲訪問的節點。
複雜性分析
設二叉樹中元素數目為n。逐層遍歷的空間複雜性均為O (n),時間複雜性為O(n)。當t為滿二叉樹時,逐層遍歷所需要的佇列空間為O(n)。每個遍歷算法花在樹中每個節點上的時間為O(1) (假設訪問一個節點的時間為( 1 ) )。