二叉樹的非遞迴和遞迴遍歷C語言詳解

2023-01-04 20:51:03 字數 1071 閱讀 3897

最易懂的二叉樹的遞迴和非遞迴實驗**

建立一顆用作實驗的二叉樹 1

先根(序)遍歷 2

中根(序)遍歷 4

後根(序)遍歷 5

測試主函式 7

當然,這是最笨的一種生成特定二叉樹的方法

所謂先根遍歷,也就是從先遍歷根節點,然後遍歷左子樹,最後右子樹。遞迴的**非常簡單:

遞迴呼叫看起來並沒什麼難點,接下來就看看非遞迴呼叫的style:

在給出**之前,先分析一下我們的迴圈。為了再訪問完左子樹後,還能倒回去訪問右子樹,我們不得不儲存當前的節點。這裡用到乙個叫做堆疊的資料結構,當然這裡我們用陣列模擬它。

定義乙個陣列:

過程描述:

我們遇到第乙個根節點,處理,儲存第乙個節點陣列情況為

topele=0;

我們訪問a的左子樹,不為空,處理,入棧

topele=1

再繼續訪問左子樹,不為空,處理,入棧

topele=2

再繼續訪問左子樹,為空,出棧,取出棧頂元素b;

topele=0

處理b的右子樹e,e的左子樹不為空,不入棧,處理右子樹,為空,不入棧。再出棧,取元素a,處理a的右子樹c,c的左子樹不為空,入棧,處理c。然後,處理c的左子樹f,f的左右子樹為空,去棧頂元素c,處理c的右子樹,在取棧頂元素,棧為空,遍歷結束。

**描述:

遞迴比較簡單就直接上遞迴的**了

非遞迴呼叫與先根不同的是根節點的處理時機;

也就是說入棧的時候不處理,等出棧的時候在處理:

依然先上遞迴**:

非遞迴**:

後序遍歷的非遞迴**實現起來最為複雜。後序遍歷的順序是,左子樹,右子樹,根節點。如何從右子樹到根節點,是乙個難點。

這裡採用乙個標誌位flag,來標識訪問的次數,來區分是從左子樹,還是右邊子樹返回的。

下面的**表示乙個堆疊的結構,第一列表示stac元素,第二列表示flag元素

topele=2

依次輸出

測試結果:

在完全掌握二叉樹的遍歷後,反過來就可以通過遞迴來建立二叉樹了。這個問題會在我的下一篇關於二叉樹的文件中詳細講到。

非遞迴遍歷二叉樹

遍歷二叉樹的非遞迴演算法 編寫的方法 根據樹中結點的遍歷規律及順序直接寫出其非遞迴演算法。先序非遞迴演算法 思路 假設 t是要遍歷樹的根指標,若t null 對於非遞迴演算法,引入棧模擬遞迴工作棧,初始時棧為空。問題 如何用棧來儲存資訊,使得在先序遍歷過左子樹後,能利用棧頂資訊獲取t的右子樹的根指標...

二叉樹的遍歷

飛機票訂票系統 二 一四年六月 二叉數的遍歷 1 問題陳述 二叉樹的中序 前序 後序的遞迴 非遞迴遍歷演算法,層次序的非遞迴遍歷演算法的實現,應包含建樹的實現。限1 人完成 二叉樹的前序 後序的遞迴 非遞迴遍歷演算法,層次序的非遞迴遍歷演算法的實現,應包含建樹的實現。先序遍歷二叉樹演算法 若二叉樹為...

二叉樹遍歷技巧

二叉樹先根序 後根序 中根序遍歷的速演算法 解題技巧 經過研究我找出了一種不用畫圖,由先 後 根序遍歷和中根序遍歷迅速確定遍歷結果的辦法。謹以此文獻給智商與我同級而又不得不研究演算法的朋友。抽象思維太差,用例子來說明吧。下面這個是後根遍歷的演算法。例1 已知某二叉樹的先根序遍歷為abcdefg,中根...