二叉搜尋樹的遍歷——深度優先和廣度優先
前面的文章我們講了二叉搜尋樹的插入和搜尋的基礎,今天這篇文章我們講二叉搜尋樹中一個非常關鍵的概念:遍歷。遍歷,顧名思義,就是把所有的節點都要過一遍。那怎麼去過呢,是先橫後縱,還是先縱後橫呢。在二叉搜尋樹中,遍歷的方式大致分為兩種,一種是深度優先遍歷,一種是廣度優先遍歷。這裡面以深度優先的遍歷最為常用,而且深度優先遍歷中,還會分出三種不同的遍歷方法。下面,我們就從深度優先遍歷開始介紹。
深度優先遍歷
對於深度優先遍歷來說,最關鍵的就是遍歷的時候先要把當前節點的左子樹遍歷完,然後再把當前節點的右子樹遍歷完。在遍歷左右子樹的時候,當前節點的遍歷順序,決定了當前二叉搜尋樹中所有節點的列印順序。而且,同樣是根據當前節點的遍歷順序,我們把深度優先遍歷分為三種:前序遍歷、中序遍歷,以及後序遍歷。
具體示意圖如下:

深度優先遍歷示意圖
如上圖所示,我們在當前節點41的左下、中下,以及右下又分別放置了三個空心小圓點。我們可以這樣規定:當我們想根據深度優先演算法遍歷該二叉搜尋樹時,這三個空心小圓點一旦被訪問,就要被填充。因此,當我們在填充左下這個小圓點之前,遍歷當前節點,那就是前序遍歷;當我們在填充中下這個小圓點之前,遍歷當前節點,那就是中序遍歷;當我們在填充右下這個小圓點之前,遍歷當前節點,那就是後序遍歷。
結合這三個輔助的小圓點,我們可以更好的認識這三種深度優先遍歷演算法。下圖就是結合著三個小圓點,將一棵二叉搜尋樹按照前序遍歷的方式,進行了所有節點的遍歷。

前序遍歷示意圖
有了前序遍歷示意圖,希望你能夠根據該示意圖將二叉搜尋樹的中序遍歷和後序遍歷畫出來。那這三種深度優先的遍歷演算法有什麼用呢?
對於前序遍歷來說,當我們想要列印一個樹形結構時,比如列印某個資料夾的目錄結構,前序遍歷是不二之選;
對於中序遍歷來說,因為打印出來具有從小到大的順序,所以使用場景就不用多說了;
對於後序遍歷來說,當想進行破壞性操作時,可以使用該遍歷演算法。因為後序遍歷是把左右子樹都遍歷完成之後,才會遍歷當前節點,所以如果我們想釋放一棵二叉搜尋樹的所有空間,肯定要把當前節點的左右子樹都釋放完,才能釋放當前節點。
廣度優先遍歷
廣度優先遍歷在二叉搜尋樹中又叫層序遍歷。對於二叉搜尋樹中,層序遍歷使用的並不多。之所以要介紹廣度優先遍歷,是因為廣度優先遍歷是一個非常重要的概念。廣度優先遍歷在我們後續介紹圖的時候,將會是一個非常重要的遍歷方法。
那在二叉搜尋樹中,該如何實現廣度優先遍歷呢?我們需要藉助一個先進先出的佇列來輔助實現,下面是我們實現的具體示意圖:

廣度優先遍歷示意圖
如上圖所示,對於廣度優先遍歷演算法來說,有這個先進先出佇列的輔助非常重要。我們第一步是把該二叉搜尋樹的根節點放到佇列中,後面即為訪問先進先出佇列的過程。當先進先出佇列不為空的時候,我們就彈出該佇列中的第一個元素,彈出這個元素的時候,要檢查該元素有沒有對應的左右孩子節點,如果有則要將該左右孩子節點分別放入佇列,如果沒有,則訪問下一個節點,依次類推。
好了,這就是我們介紹的二叉搜尋樹的兩種遍歷方法,相比較而言,深度優先遍歷更為常用,但這並不是說廣度優先演算法不重要。後面在介紹圖的時候你會發現,廣度優先演算法同樣非常重要。
我是徐建航, 這是我寫的第73篇文章,歡迎你加入007社群,七天寫一篇,一起寫七年,七年之後一起去南極。
