二叉樹的非遞迴遍歷演算法訪問

2021-10-11 00:10:01 字數 1298 閱讀 2869

二叉樹的非遞迴遍歷演算法需要借助棧實現。

二叉樹的中序遍歷順序為:先遍歷左子樹,後根結點,最後遍歷右子樹。

初始時一次掃瞄根結點的所有左側結點並將它們一一進棧。

出棧乙個結點,訪問它;

掃瞄該結點的右孩子結點並將其進棧。

依次掃瞄右孩子結點的所有左側結點並一一進棧;

反覆此過程直至棧空即表示完成該二叉樹的遍歷。

如圖:

根據步驟1的操作,我們需要將二叉樹的1,2,3,7結點依次壓入棧中。棧頂

7421

棧底根據步驟2的操作,將結點7出棧並訪問它,並根據步驟3,掃瞄該結點右孩子並將其進棧。棧頂

421棧底

由於以結點7為根結點的子樹中沒有右孩子結點,繼而其左側結點也為空。則此時繼續執行步驟2,繼續出棧乙個結點,即結點4。棧頂

21棧底此時訪問結點4,並執行步驟三掃瞄其右孩子並將其進棧。由於其有孩子結點為空,所以右孩子結點的左側結點也為空。因此繼續出棧乙個結點2。棧頂

1棧底此時訪問結點2,然後訪問其右孩子,掃瞄右孩子結點5將其進棧。此時執行步驟4時,由於結點5的右孩子結點為空,所以只執行完步驟3。棧頂

51棧底然後緊接著執行步驟2,將結點5出棧,並訪問它,並繼續後面的操作3和4,由於結點5的無子節點,所以無後續操作。此時的棧情況為:

棧頂

1

棧底

此時執行步驟2,將結點1出棧,然後掃瞄其右孩子結點並將其進棧,緊接著掃瞄有孩子結點的所有左側結點並意義進棧。此時完這些操作後,此時的棧情況如下:棧頂

63棧底最後先對結點6從步驟2開始執行,然後執行後續步驟;接著對結點3從步驟2開始執行,然後執行後續步驟。最後直至棧為空。

最後得到的該二叉樹的中序遍歷順序為:7,4,2,5,1,6,3。

void inorder(bitree t) 

else

個人理解:根據**可知,某種情況下遞迴演算法和非遞迴演算法之間可以通過迴圈來進行轉換。

二叉樹遍歷 非遞迴演算法

文庫文章 二叉樹前序遍歷 根 左結點 右結點 所以在訪問到乙個節點不為空時 先訪問此結點,然後把此結點的非空右孩子先入棧,然後再把非空左孩子入棧。具體 如下 二叉樹後序非遞迴演算法 第二種思路 要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點p,先將其入棧。如果p不存在左孩子和右孩子,...

二叉樹遍歷非遞迴演算法

輸入 include include define maxsize 100 typedef char elemtype using namespace std typedef struct node btnode 建立二叉樹 void createbtnode btnode b,char str j...

二叉樹遍歷非遞迴演算法

遞迴演算法非常的簡單。先訪問跟節點,然後訪問左節點,再訪問右節點。如果不用遞迴,那該怎麼做呢?仔細 一.先序遍歷 看一下遞迴程式,就會發現,其實每次都是走樹的左分支 left 直到左子樹為空,然後開始從遞迴的最深處返回,然後開始恢復遞迴現場,訪問右子樹。由於一直走到最左邊後,需要逐步返回到父節點訪問...