二叉樹的先序,中序,後序遍歷(非遞迴)和層序遍歷

2021-08-21 03:29:21 字數 1415 閱讀 1574

先序遍歷:

void btreeprevordernonr(btnode* root)

top = stacktop(&s);

stackpop(&s);

cur = top->_right;

} printf("\n");

}

首先建立乙個棧結構,用於儲存二叉樹的結點。開始遍歷二叉樹,當當前結點或者棧不為空的時候,表示遍歷沒有結束,輸出當前結點(從根結點開始),並把當前結點儲存到棧中,然後遍歷左結點,重複此迴圈直到左結點為空。記錄棧頂元素top,然後刪除棧頂元素,把記錄下來的棧頂元素top的右結點為當前結點,再重複上述迴圈。

中序遍歷:

void btreeinordernonr(btnode* root)

top = stacktop(&s);

printf("%d ", top->_data);

stackpop(&s);

cur = top->_right;

} printf("\n");

}

和先序遍歷類似,當當前結點或者棧不為空的時候,表示遍歷沒有結束,將當前結點入棧,然後遍歷左結點,直到左結點為空。記錄當前棧頂元素top,輸出記錄的棧頂元素,然後刪除棧頂元素,將當前結點變為記錄的棧頂元素的右結點,重複上述迴圈。

後序遍歷;

void btreepostordernonr(btnode* root)

top = stacktop(&s);

if (top->_right == null || top->_right == last)

else

}printf("\n");

}

後序遍歷與先序遍歷和中序遍歷有所不同,我們需要定義乙個last結點來作為乙個標記,開始的時候使last為空。當當前結點或棧補位空的時候,表示遍歷沒有結束。首先將當前結點入棧,然後遍歷當前結點的左結點直到左結點為空。記錄棧頂元素top,如果記錄的棧頂元素top的右結點為空或者等於last時,輸出記錄的棧頂元素top,將top賦給last,然後刪除棧頂元素。如果不滿足上述條件則使當前結點為top的右結點。引入last的作用時防止遍歷完右結點之後遍歷父親結點時陷入死迴圈。這樣在遍歷父親結點的時候,如果已經遍歷過該父親結點的右結點時,last中記錄的就是該右結點,滿足判斷條件top->_right==last後即可輸出該父親結點,否則就會重複迴圈右結點。

層序遍歷:

void btreelevelorder(btnode* root)

}

層序遍歷需要先建立乙個佇列,用於存放二叉樹的結點。首先我們遍歷二叉樹的根結點,將該節點存放到佇列中,定義乙個結點front來記錄隊頭元素,輸出該結點。然後刪除隊頭元素。再將記錄的隊頭元素front的左右結點分別入佇列。重複上述操作直到隊列為空。

二叉樹的非遞迴遍歷(先序,中序,後序)

遍歷演算法 1 中序遍歷的遞迴演算法定義 若二叉樹非空,則依次執行如下操作 1 遍歷左子樹 2 訪問根結點 3 遍歷右子樹。2 先序遍歷的遞迴演算法定義 若二叉樹非空,則依次執行如下操作 1 訪問根結點 2 遍歷左子樹 3 遍歷右子樹。3 後序遍歷得遞迴演算法定義 若二叉樹非空,則依次執行如下操作 ...

二叉樹的非遞迴先序,中序,後序遍歷

二叉樹的非遞迴遍歷 先序遍歷,中序遍歷,後序遍歷 include include using namespace std typedef struct node binode,bitree 先序遞迴建立樹,這裡注意引數的型別,t的型別是 如果是 稍加改動就ok.void createtree bit...

二叉樹的非遞迴先序 中序 後序遍歷

演算法思想 先序 nlr的訪問順序,由於r節點,即右孩子的訪問需要通過根節點的指標來實現,所以,需要設乙個棧來儲存根節點。具體看 void preorder btree t else while 中序遍歷和先序遍歷幾乎一樣 void midorder btree t else 後序遍歷 lrn順序。...