非遞迴方法遍歷二叉樹

2021-08-22 18:20:56 字數 1084 閱讀 9403

思路:

前序遍歷由圖示是先一里路向左全遞迴壓棧並且邊壓棧邊列印,直到左指標為空,然後得到棧頂指標,並出棧,找該棧頂結點的右結點,如果不為空,同樣的一路左遞迴壓棧,邊壓棧邊列印,直到左指標為空,然後重複,最後棧為空停止。

//借用棧實現回到前乙個結點

// 非遞迴遍歷

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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...