資料結構 二叉樹的非遞迴遍歷

2021-10-02 23:04:10 字數 1543 閱讀 4556

之前的文章,我們詳細的講述了二叉樹的建立、遍歷等的實現,但是都是以遞迴的方式。其實我們知道遞迴的過程是乙個不斷開闢棧幀的過程,會影響演算法的執行效率,那麼這篇文章主要是站在c語言的角度為大家分析一下二叉樹的非遞迴前序、中序、後序遍歷~

1、二叉樹的前序遍歷

(1)第一步:建立乙個二維指標,用來儲存每乙個結點的位址,定義棧頂指標top,初始化為-1,並將根結點存入棧中

(2)第二步:棧頂指標不為-1的時候就進入while迴圈,輸出當前棧頂元素p的資料域,代表前序遍歷的第乙個結點為根結點

(3)第三步:如果當前的p結點擁有右子樹,將這個右子樹結點存入棧中,沒有則不存(因為棧是先進後出,所以先存右子樹,再存左子樹)

(4)第四步:如果當前的p結點擁有左子樹,將這個左子樹結點存入棧中,沒有則不存

(5)再判斷top是否為-1,之後重複執行2,3,4步驟。

void  preorder(bittree *bt)

free(s)

;}

2、二叉樹的中序遍歷

(1)第一步:與非遞迴前序遍歷相同,同樣需要乙個二維指標的棧,棧頂元素初始化為-1;

(2)首先if的判斷條件,這個二叉樹不為空

(3)再進入if條件語句中的while迴圈,這個迴圈是將根結點相連所有左子樹全部存入棧中

(4)退出迴圈過後,再判斷第二個while迴圈的條件,棧不為空,則進入while迴圈

(5)首先輸出距離與根結點相連最遠的左子樹

(6)如果這個結點擁有右子樹,先將這個右子樹結點存入棧中

(7)再判斷這個結點是否擁有左子樹,有的話將與這個結點相連的所有左子樹存入棧中,沒有就不執行while迴圈

(8)在判斷top是否為-1,成立進入迴圈,重複上述步驟即可;

void inorder(bittree *bt)

while(top != 1)//棧空時結束迴圈

break

;//結束當前迴圈,回到第二個while迴圈繼續剛才步驟

}}}}

3、二叉樹的後序遍歷

1> 同樣建立乙個二維指標的棧,用來儲存每個結點的位址;

2> 進入do-while迴圈,首先,將與根結點相連的所有左子樹都存入棧中;

3> 將bittree型別的指標p賦空,判斷while迴圈是否成立;

4> 如果這個最後乙個結點的右子樹==p,則輸出當前結點的資料域,棧頂指標–;

5> 並將這個結點賦給指標p表示這個結點已經訪問過,並且已經輸出;

6> 如果當前結點的右子樹!=p,則接著訪問這個結點的右子樹,並且結束while迴圈,判斷do-while迴圈的判斷條件;

7> 重複上述過程,知道不滿足do-while迴圈的判斷條件;

void postorder(bittree* bt)

p = null;

while(top != -1)

else

}}while(top != 1;

}

資料結構 二叉樹的遞迴 非遞迴遍歷

複習一下二叉樹遞迴非遞迴的先中後序遍歷 寫非遞迴後序遍歷的時候卡殼了,參考了一下網上的思路,大概有兩種,一種是標記每個節點是否有走過,如果父節點的左右子節點都標記訪問過,則可以訪問父節點 一種是定義乙個指標,指向上乙個訪問的節點,如果某父節點的右子節點為null或者是上乙個訪問的節點,則該父節點應當...

資料結構 二叉樹遍歷非遞迴實現

資料結構中二叉樹的遍歷主要分為先序,中序和後序。順序是相對根節點來說的。先序中序非遞迴實現比較簡單,後序較為複雜些,需要判斷右子樹是否為空或遍歷完。以下為三種遍歷方法的非遞迴c實現 include include typedef struct binode binode,bitree typedef...

資料結構 二叉樹遍歷 非遞迴演算法

二叉樹的遍歷非遞迴演算法。include include define maxsize 100 typedef char elemtype using namespace std typedef struct node btnode void createbtnode btnode b,char s...