二叉樹的遍歷和線索二叉樹

2021-09-29 02:23:00 字數 2150 閱讀 7246

二叉樹的遍歷,所謂二叉樹的遍歷,是指按某條搜尋路徑訪問樹中的每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。

由二叉樹的遞迴定義可知,遍歷一棵二叉樹便要決定對根結點n,左子樹l和右子樹r的訪問順序。按照先遍歷再遍歷右子樹的原則,常見的遍歷次序有先,中,後三種遍歷方法,其中序指的是根結點再何時被訪問。

先序遍歷的操作過程為:如果二叉樹為空,什麼也不做,否則:

1.訪問根結點 2.先序遍歷左子樹 3.先序遍歷右子樹,對應的遞迴條件如下:訪問根結點,遞迴遍歷左子樹,遞迴遍歷右子樹。

中序遍歷,中序遍歷的操作過程如下:如果二叉樹為空,什麼也不做:1.中序遍歷左子樹。2.訪問根結點。3.中序遍歷右子樹。對應的遞迴演算法如下。 1.遞迴遍歷左子樹。2.訪問根結點 3.遞迴遍歷右子子樹。

後序遍歷,後序遍歷的操作過程為,如果二叉樹為空,什麼也不做,否則:1.後序遍歷左子樹 2.後序遍歷右子樹 3.訪問根結點。對應的遞迴演算法如下:遞迴遍歷左子樹 遞迴遍歷右子樹 訪問根結點

三種遍歷演算法中遞迴遍歷左,右子樹的順序都是固定的,只是訪問根結點的順序不同,不管採用哪種遍歷演算法,每個結點都訪問一次且僅訪問一次,故時間複雜度是不變的。在遞迴遍歷中,遞迴工作棧的棧深恰好為樹的深度,所以在最壞的情況下,二叉樹是有n個結點且深度為n的單支樹,遍歷的演算法的時間複雜度依舊不變。以上三種遍歷方式以及演算法描述是簡單易懂的,讀者需要將它作為模板來記憶,考研中很多題目由此而來。

遞迴演算法與非遞迴演算法的轉換。可以借助棧,將二叉樹的遞迴演算法轉化為非遞迴演算法,下面以中序遍歷為例給出中序遍歷的非遞迴演算法,先掃瞄(並非訪問)根結點的所有左結點並將它們一一進棧。然後出棧乙個結點*p,則訪問它。然後掃瞄該結點的右孩子結點,將其進棧,再掃瞄該右孩子結點的所有左結點並一一進棧,如此繼續,直到棧空為止。

中序遍歷的非遞迴演算法如下,二叉樹中序遍歷的非遞迴演算法,演算法需要借助乙個棧:1.初始化棧,p是遍歷指標 2.棧不空或p不空時迴圈。3.根指標進棧,遍歷左子樹 4.每遇到非空二叉樹先向左走 5.根指標退棧,訪問根結點,遍歷右子樹。 5.退棧,訪問根結點 6.再向右子樹走。

顯然非遞迴演算法的執行效率要高於遞迴演算法,類似地可以先序遍歷與後序遍歷的非遞迴演算法,其中後序遍歷演算法,其中後序遍歷的非遞迴演算法比較複雜,留給讀者。

層次遍歷,如圖所示為二叉樹的層次遍歷,即按照箭頭所指二點方向,按照1,2,3,4的層次遍歷,對二叉樹中各個結點進行訪問。

要進行層次遍歷需要借助乙個佇列,先將二叉樹根結點入隊,然後出隊,訪問根結點,如果它有左子樹,則將左子樹根結點入隊,如果它有右子樹,則將右子樹根結點入隊,然後出隊,對出隊結點訪問,如此反覆,直到隊列為空。二叉樹的層次遍歷演算法如下:

初始化輔助佇列 將根結點入隊 佇列不空迴圈 隊頭元素出隊,訪問當前所指向結點, 左子樹不為空,則左子樹入佇列 右子樹不空,則右子樹入佇列

對於上述二叉樹層次遍歷的演算法,讀者在複習過程當中應該將其作為乙個模板,在熟練掌握其執行過程的基礎上來記憶,並能夠達到熟練默寫的程度,這樣才能將層次遍歷模板應用於各種題目之中。

遍歷是二叉樹各種操作的基礎,可以在遍歷的過程中對結點進行各種操作,例如,對於一棵已知樹求結點的雙親,求結點的孩子結點,求二叉樹的深度,求二叉樹葉子結點的個數,判斷二叉樹是否相等,所有這些操作都建立在而擦函式遍歷的基礎上,因此,必須掌握二叉樹的各種遍歷過程。並能靈活運用以解決各種問題。

由遍歷序列構造二叉樹,由二叉樹的先序序列和中序序列可以唯一確定一棵二叉樹,在先序遍歷序列中,第乙個結點一定是二叉樹的根結點,而在中序遍歷中,根結點必然將中序序列分割成兩個子串行,前乙個子串行就是根結點的左子樹的中序序列,後乙個子串行是根結點的右子樹的中序序列。根據這兩個子串行,在先序序列的第乙個結點是左子樹的根結點,右子串行的第乙個結點是右子樹的根結點,如此遞迴下去,便能唯一確定這棵二叉樹。

由二叉樹的後序序列和中序序列也可以唯一確定一棵二叉樹,因為後序序列的最後乙個結點就如同先序序列的第乙個結點,可以將中序序列分割成兩個子串行,然後採用類似的方法遞迴進行劃分,就可以得到一棵二叉樹。

由二叉樹的後序序列和中序序列也可以唯一確定你一棵二叉樹,實現方法留給讀者思考。需要注意的是,如果只知道二叉樹的先序序列和後序序列,則無法確定唯一一棵二叉樹。

求先序序列和中序序列所確定的二叉樹,首先,由先序序列可知a為二叉樹的根結點。中序序列中a之前的bc為左子樹的中序序列,。。。為右子樹的中序序列。然後由先序序列可知b是左子樹的根結點,d是右子樹的根結點。依次類推,得到了剩下的結點的分解,最後的得到二叉樹如下

二叉樹的遍歷和線索二叉樹

1 遍歷二叉樹 以一定的規則將二叉樹的結點排列成乙個線性序列。2 線索二叉樹 實質就是遍歷一次二叉樹,從而充分利用傳統二叉鍊錶中的空指標,不浪費儲存空間。目的在於利用線索二叉樹可以加快查詢結點的前驅和後繼的速度。3 先序和中序 後序和中序 層序和中序 可以確定唯 一 一 顆二叉樹。只知道先序和後序,...

二叉樹的遍歷和線索二叉樹

void preorder bitree t void inorder bitree t void postorder bitree t void preordertr erse bitree t else void inordertr erse bitree t else 後序非遞迴遍歷二叉樹的順...

線索二叉樹遍歷

1.對二叉樹線索化之後,若結點沒有右子樹,則右子樹指向遍歷後繼結點 若沒有左子樹,則左子樹指向遍歷前驅結點。2.對線索二叉樹進行遍歷,即不斷找結點的後繼。若右指標直接指向了後繼,那直接就有了 結點右指標沒有指向後繼,即有右子節點,那就通過常規方法找到後繼。如後序線索樹後繼不好找,需要棧才能進行遍歷。...