思路:
前序遍歷由圖示是先一里路向左全遞迴壓棧並且邊壓棧邊列印,直到左指標為空,然後得到棧頂指標,並出棧,找該棧頂結點的右結點,如果不為空,同樣的一路左遞迴壓棧,邊壓棧邊列印,直到左指標為空,然後重複,最後棧為空停止。
//借用棧實現回到前乙個結點
// 非遞迴遍歷
void btreeprevordernonr(btnode* root)
top = stacktop(&
stack);
stackpop(&
stack);
cur = top->_right;}}
思路:
和前序遍歷不一樣的地方只是列印的地方不一樣,乙個是順著一步一步入棧的時候列印,乙個是出棧前列印,這樣會導致結點資料和結點左指標的資料列印的時候反過來。
void btreeinordernonr(btnode* root)
top = stacktop(&
stack);
printf("%d ", top->_data);
stackpop(&
stack);
cur = top->_right;}}
思路:
由圖示是先一里路向左全遞迴壓棧,直到左邊為空,然後出棧先判斷右邊是不是空,如果是空的話,列印出棧的結點,並且出棧該結點,如果不是就到裡面去遞迴壓棧。
//有乙個重點需要判斷右子樹已經被訪問了,所以要紀錄是否右子樹是否被訪問
void btreepostordernonr(btnode* root)
top = stacktop(&
stack);
//左子樹為空或者右子樹已經被訪問就列印本結點,它的左子樹和右子樹已經先被列印了
if (top->_right ==
null
||top->_right == prev)
else}}
二叉樹遍歷(遞迴 非遞迴)
二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...
二叉樹非遞迴遍歷
二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...
非遞迴遍歷二叉樹
中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...