.
[url=先序遍歷二叉樹的遞迴演算法怎樣理解[/url]
二叉樹的結點結構是:
1、根結點(存放結點資料)
2、左子樹指標
3、右子樹指計
對二叉樹的遍歷就是訪問各個結點中根結點裡存放的資料。例如:
如果結點a有左結點b,右結點c,記作a(b,c),不同結點我用"\"隔開。那麼有這樣乙個(bittree)二叉樹表a(b,c) \b(d,e)\e(f.g)\c(空,h)\h(i.空), 自己畫出來,不然我後面白講了。
[img]
要想把所有的資料都訪問到則必需按照一定的原則,即當前結點的下乙個結點是哪個結點。
無論是先、中還是後序演算法都是先將左結點視為下乙個結點,當左結點不存在(即為空時)才將右結點視作下乙個結點,如果右結點也不存在就返回當前結點的上層結點再向右訪問,如此類推。
於是對二叉樹的遍歷問題就被抽象成三個基本步驟:
1、訪問根結點。
2、訪問該點的所有左子樹。
3、訪問該點的所有右子樹。
先序遍歷的策略是按123的步驟執行,中序是按213來,後序則是231,它們之間的不同只是「訪問根結點」在這三個步驟中的位置。
看著你剛畫好的那個bittree跟著我的思路走。在先序遍歷演算法priororder中,先將bittree的頭結點a傳進來,按步驟123的處理。123是抽象實現,記住所表達的思想,下面是具體實現。為了避免混亂用中文數字記錄步驟。
一、即是讀取結點a的資料內容a(此時a為當前函式處理結點),將a的右結點c放入棧s中,s中的內容為s(c)[注意這一步是演算法的乙個輔助,並不是先向右訪問,下同],將左結點b傳給priororder處理。此時讀取了a
二、讀取b的內容b(此時b為當前結點),將b的右結點e放入s中,s中的內容為s(c,e),將b的左結點d傳給priororder處理。此時讀取了ab
三、d為當前結點,d的右為空沒有東西放入s,s中的內容仍為s(c,e),d的左也為空,沒有訪問可訪問的。此時就從s中取出e(因為棧是先進後出的所以取的就是e,此時s中的內容為s(c),正好是上一層沒訪問過的右子樹),將e傳給priororder處理。此時讀取了ab d
四、e為當前結點,對於結點e類似的有s(c,g),讀取了abde,將f傳入priororder
五、f為當前結點,右為空,左也為空,讀取了abdef,從棧中取出g傳給priororder處理,s的內容為s(c);
六、類似的讀取了abdefg,從s中取出了c,傳給priororder處理。此時s()。
七、當前結點為c,從將c的右結點放入s,s中內容為s(h),c的左為空,從s取出h,將h傳給priororder處理。此時s為s().於是就讀取了abdefgc
八,類似的讀取了abdefgch
九,最後abdefgchf
你再對照的書上的演算法想想,畫畫就應該能明白點。特別要理角的一點是為什麼用遞迴演算法時計算機能按這樣的方式是因為函式呼叫是「先呼叫,後執行完」,或者說「後呼叫,先執行完」。注意我加乙個「完」字
.
先序遞迴構造二叉樹 中序遞迴遍歷二叉樹
include stdio.h include malloc.h typedef struct bitnodebitnode,bitree char ch abc de g f int i 0 int createbitree bitree t else return 1 void preorder...
建立二叉樹(遞迴 先序遍歷)
建立二叉樹 遞迴 先序遍歷 1 自輸入資料元素,形參為引用型別或二級指標 class treenode 遞迴 先序遍歷建立二叉樹 void createbinarytree treenode root 形參必須宣告為引用型別或二級指標 else root nullptr 輸入 1 2 3 1 1 4...
二叉樹非遞迴先序遍歷
二叉樹的遞迴先序遍歷很簡單,假設二叉樹的結點定義如下 1 struct binarytreenode 2 遞迴先序遵循 根 左 右的順序 1 void preorder binarytreenode root 2非遞迴我們以乙個例子說明,仍然以之前博文的乙個二叉樹說明 1 82 36 104 55 ...