二叉樹的遍歷常見的分為三種方式:前序遍歷、中序遍歷、後序遍歷。簡單的理解,所謂的前、中、後的不同實際上就是訪問根節點時機的不同。
typedef struct _binode
binode, *bitree;
一、
對於樹的遍歷操作,常見的方式是採用遞迴的形式,此處不詳細介紹遞迴。常見的採用遞迴實現中序遍歷的思想就是在判斷完輸入的樹的節點符合函式要求後,優先呼叫便利函式訪問左子樹,在訪問列印根節點,最後再遞迴呼叫函式訪問右子樹。**如下:
//中序遍歷
bool inorder(binode *root)
else
}
二、
下面說一種不常用的方式——不採用遞迴。中序遍歷,顧名思義,根節點要在中間訪問,但不能保證是不是第幾次經過的時候訪問。舉例來說,第一次經過根節點並不訪問而在左子樹訪問完畢第二次經過根節點的時候才進行節點資料的訪問。所以,符合先經過後訪問,後經過先訪問的特點。那麼,很明顯,這個特點比較適合用棧結構來實現。畢竟棧最大的特點就是先入後出,後入先出。
在不考慮棧結構與**實現的前提下,本文選擇了呼叫stl庫中的棧來實現。
中序遍歷要從左子樹「最左」的節點開始訪問。那麼我們第乙個任務就是找到這個結點:在這個過程中,我們把所有的有左子樹的節點入棧,直至找到第乙個沒有左子樹的結點。**如下:
binode *gofarleft(binode *t, stack&s)
while (t->lchild)
return t;
}
1在找到了「最左」的節點以後,我們就可以開始遍歷工作。
2.1首先,「最左」的節點此時必定沒有左子樹,那麼此節點就是「本地」的根節點,因為中序遍歷的特點,預設地訪問並列印這個結點。
2.2其次,中序遍歷最後訪問的是右子樹,那麼此時應該訪問「最左」結點的右子樹,有兩種結果:(1)存在右子樹,那麼為了判斷右子樹中的節點是否還繼續擁有左節點,則應呼叫上方的函式繼續查詢此處的「最左」結點,即重複步驟1,直至找到不存在右子樹的節點為止。(2)如若不存在右子樹,那麼在已經訪問完左、根節點的前提下,可以認定這個結點已經訪問完畢。
2.3回退,將棧頂元素列印出棧,此節點為「最左」節點的根節點,接著訪問右子樹,重複步驟1.
3.重複執行上述操作後即可遍歷完畢根節點的整個左子樹,列印根節點,再次同樣步驟遍歷右子樹,直到棧中元素為空且沒有右子樹位置。
**如下:
void inorder(binode *t)
//如果t沒有右子樹,根據棧頂指示,訪問棧頂元素
else if (!s.empty())
//如果t沒有右子樹,並且棧為空
else
}}
二叉樹的中序遍歷(兩種實現方式)
二叉樹採用鏈式儲存結構進行儲存。二叉樹的定義為 typedef struct nodebitree 中序遍歷 ldr 是二叉樹遍歷的一種,也叫做中根遍歷 中序周遊。在二叉樹中,中序遍歷首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。示例 遞迴實現 左子樹遞迴輸出,輸出該結點值,再右子樹遞迴輸出。vo...
BFS和DFS兩種方式實現二叉樹的層序遍歷
二叉樹的前序遍歷 二叉樹的中序遍歷 二叉樹的後序遍歷 二叉樹的層序遍歷 二叉樹的前序 中序 後序 層序遍歷 解法完整版 三 總結 給你乙個二叉樹,請你返回其按層序遍歷得到的節點值。即逐層地,從左到右訪問所有節點 例如 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返...
兩種方式建立二叉樹,並分行列印二叉樹 C 實現)
方法一 先分別建立節點,再根據連線關係連線各節點 方法二 輸入為vector,遞迴實現建立,通過int型陣列 層序 建立二叉樹,用 1表示空節點。使用佇列的先進先出特性,以層序方式輸出列印二叉樹 具體的 實現寫在了標頭檔案中,如下 created by zzh on 2020 4 26.ifndef...