1. 程式人生 > >樹的深度優先搜尋和廣度優先搜尋

樹的深度優先搜尋和廣度優先搜尋

1、區別

       1) 二叉樹的深度優先遍歷的非遞迴的通用做法是採用棧,廣度優先遍歷的非遞迴的通用做法是採用佇列。

       2) 深度優先遍歷:對每一個可能的分支路徑深入到不能再深入為止,而且每個結點只能訪問一次。要特別注意的是,二叉樹的深度優先遍歷比較特殊,可以細分為先序遍歷、中序遍歷、後序遍歷。具體說明如下:

  • 先序遍歷:對任一子樹,先訪問根,然後遍歷其左子樹,最後遍歷其右子樹。
  • 中序遍歷:對任一子樹,先遍歷其左子樹,然後訪問根,最後遍歷其右子樹。
  • 後序遍歷:對任一子樹,先遍歷其左子樹,然後遍歷其右子樹,最後訪問根。

        廣度優先遍歷:又叫層次遍歷,從上往下對每一層依次訪問,在每一層中,從左往右(也可以從右往左)訪問結點,訪問完一層就進入下一層,直到沒有結點可以訪問為止。   

     3)深度優先搜素演算法:不全部保留結點,佔用空間少;有回溯操作(即有入棧、出棧操作),執行速度慢。

          廣度優先搜尋演算法:保留全部結點,佔用空間大; 無回溯操作(即無入棧、出棧操作),執行速度快。

          通常 深度優先搜尋法不全部保留結點,擴充套件完的結點從資料庫中彈出刪去,這樣,一般在資料庫中儲存的結點數就是深度值,因此它佔用空間較少。

所以,當搜尋樹的結點較多,用其它方法易產生記憶體溢位時,深度優先搜尋不失為一種有效的求解方法。  

          廣度優先搜尋演算法,一般需儲存產生的所有結點,佔用的儲存空間要比深度優先搜尋大得多,因此,程式設計中,必須考慮溢位和節省記憶體空間的問題。

但廣度優先搜尋法一般無回溯操作,即入棧和出棧的操作,所以執行速度比深度優先搜尋要快些

2.二叉樹的遍歷

先序遍歷(遞迴):35 20 15 16 29 28 30 40 50 45 55  中序遍歷(遞迴):15 16 20 28 29 30 35 40 45 50 55  後序遍歷(遞迴):16 15 28 30 29 20 45 55 50 40 35  先序遍歷(非遞迴):35 20 15 16 29 28 30 40 50 45 55  中序遍歷(非遞迴):15 16 20 28 29 30 35 40 45 50 55  後序遍歷(非遞迴):16 15 28 30 29 20 45 55 50 40 35  廣度優先遍歷:35 20 40 15 29 50 16 28 30 45 55