最易懂的二叉樹的遞迴和非遞迴實驗**
建立一顆用作實驗的二叉樹 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,中根...