1樓:匿名使用者
遞迴不遞迴只是表象,本質都是壓棧,出棧的操作,只不過遞迴是以函式為元素進行的棧操作,不遞迴演算法就是把樹的元素來棧操作,在一個函式內部完成,看起來就沒有遞迴。
2樓:匿名使用者
非遞迴的話,就用堆疊實現了啊
先序遍歷二叉樹的遞迴演算法怎樣理解?
3樓:匿名使用者
二叉樹的結點結構是:
1、根結點(存放結點資料)
2、左子樹指標
3、右子樹指計
對二叉樹的遍歷就是訪問各個結點中根結點裡存放的資料。例如:
如果結點a有左結點b,右結點c,記作a(b,c),不同結點我用"\"隔開。那麼有這樣一個(bittree)二叉樹表a(b,c) \b(d,e)\e(f.g)\c(空,h)\h(i.
空), 自己畫出來,不然我後面白講了。
要想把所有的資料都訪問到則必需按照一定的原則,即當前結點的下一個結點是哪個結點。
無論是先、中還是後序演算法都是先將左結點視為下一個結點,當左結點不存在(即為空時)才將右結點視作下一個結點,如果右結點也不存在就返回當前結點的上層結點再向右訪問,如此類推。
於是對二叉樹的遍歷問題就被抽象成三個基本步驟:
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
你再對照的書上的演算法想想,畫畫就應該能明白點。特別要理角的一點是為什麼用遞迴演算法時計算機能按這樣的方式是因為函式呼叫是「先呼叫,後執行完」,或者說「後呼叫,先執行完」。注意我加一個「完」字
非遞迴的二叉樹前序遍歷演算法有什麼用途
遞迴和非遞迴只是解決問題的方法的不同,本質還是一樣的。2.遞迴演算法相對於非遞迴演算法來說效率通常都會更低2.2 由於編譯器對附加的一些棧保護機制會導致遞迴執行的更加低效3.使用迴圈代替遞迴演算法,通常可以獲得更好的執行效率和空間效率,在二叉樹層次較深的情況下,採用非遞迴方式遍歷能夠有效的提升遍歷的...
資料結構已知一棵二叉樹的前序遍歷的結果序列是ABCDEFGHIJ,中序遍歷的結果是
如果僅有 已知一棵二叉樹的前序遍歷的結果序列是abcdefghij 則中序遍歷的結果是不能確定的。二叉樹遍歷時,只有知道前序遍歷和中序遍歷 後序遍歷和中序遍歷 才能唯一確定這顆樹,所以你的答案應該是多種。資料結構二叉樹,已知中序遍歷 後序遍歷,如何求先序遍歷?preorder遍歷 訪問根節點的操作發...
資料結構二叉樹怎麼遍歷啊,資料結構二叉樹已知中序遍歷,後序遍歷,求先序遍歷???
拿先序遍歷舉例 先序遍歷 是根左 右先遍歷根a,然後遍歷a的左子樹 是版左面那一群 然後遍歷a的右子權樹 為空 在a的左子樹中,先遍歷根也就是b,在遍歷b的左子樹也就是c,在遍歷b的右子樹,是右邊的一群。在b的右子樹中繼續 資料結構二叉樹已知中序遍歷,後序遍歷,求先序遍歷?通過分段來解決,找到根節點...