逐層遍歷

逐層遍歷

二叉樹的層次遍歷 ,顧名思義就是指從二叉樹的第一層(根節點)開始,從上至下逐層遍歷,在同一層中,則按照從左到右的順序對節點逐個訪問。在逐層遍歷過程中,按從頂層到底層的次序訪問樹中元素,在同一層中,從左到右進行訪問。

基本介紹

  • 中文名:逐層遍歷
  • 外文名:Traversal by layer by layer
  • 遍歷起點:二叉樹的根節點
  • 遍歷方式:從頂層到底層的次序訪問樹中元素
  • 同層遍歷:從左到右進行訪問
  • 套用學科:計算機科學、測繪科學
算法思想,實現,Java語言,C++語言,複雜性分析,

算法思想

用一個佇列保存被訪問的當前節點的左右孩子以實現層序遍歷。
在進行層次遍歷的時候,設定一個佇列結構,遍歷從二叉樹的根節點開始,首先將根節點指針入佇列,然後從隊頭取出一個元素,每取一個元素,執行下面兩個操作:
1、訪問該元素所指向的節點
2、若該元素所指節點的左右孩子節點非空,則將該元素所指節點的左孩子指針和右孩子指針順序入隊。此過程不斷進行,當佇列為空時,二叉樹的層次遍歷結束。

實現

Java語言

import java.util.*;class TreeNode {   int val = 0;   TreeNode left = null;   TreeNode right = null;    public TreeNode(int val) {       this.val = val;     } }public class Solution {   private  ArrayList<Integer> list=new  ArrayList<Integer>();   private Queue<TreeNode> queue=new LinkedList<TreeNode>();   public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {       if(root!=null){           queue.offer(root);       }       while(queue.peek()!=null){           removeNext();       }       return list;    }   /*    *每次在佇列中取出一個節點,並將其值插入到List中,    *此外每次取出一個節點需要把這個節點的子節點插入佇列   */   public void removeNext(){        TreeNode temp=queue.poll();       if(temp!=null){           list.add(temp.val);           if(temp.left!=null){                queue.offer(temp.left);           }           if(temp.right!=null){                queue.offer(temp.right);            }       }       else           return;    }}

C++語言

由於遍歷中所使用的數據結構是一個佇列而不是棧,因此寫一個按層遍歷的遞歸程式很困難。如下程式用來對二叉樹進行逐層遍歷,它採用了佇列數據結構。佇列中的元素指向二叉樹節點。當然,也可以採用公式化佇列。
template <class T>void LevelOrder(BinaryTreeNode<T> *t){// 對* t逐層遍歷L i n k e d Q u e u e < B i n a r y TreeNode<T>*> Q;while (t) {Visit(t); // 訪問t// 將t的右孩子放入佇列if (t->LeftChild) Q.Add(t->LeftChild);if (t->RightChild) Q.Add(t->RightChild);// 訪問下一個節點try {Q.Delete(t);}catch (OutOfBounds) {return;}}}
程式中,僅當樹非空時,才進入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 ) )。

相關詞條

熱門詞條

聯絡我們