二叉樹非遞迴先序遍歷

2022-07-26 14:27:14 字數 1337 閱讀 9604

二叉樹的遞迴先序遍歷很簡單,假設二叉樹的結點定義如下:

1

struct

binarytreenode

2;

遞迴先序遵循:根-左-右的順序

1

void preorder(binarytreenode*root)

2

非遞迴我們以乙個例子說明,仍然以之前博文的乙個二叉樹說明:

1

82 /\36

104 / \ /\55

7911

非遞迴步驟:

1.我們先定義乙個棧s,棧的每個元素為二叉樹節點型別結點

2.首先將根節點壓入s中,輸出根節點,同時彈出棧頂節點 (輸出8)

3.由於非遞迴的實質仍然是先根再左後右的順序,然而對於根結點

的左右子節點來說要先訪問左節點那麼必須先把右先節點壓棧

4.現在s中從棧頂到棧底有6,10,現在以輸出並彈出棧頂元素(輸出8,6)

5.繼續將節點6的左右子節點加入到棧s中,從棧頂到棧底有5,7,10

6.輸出並彈出棧頂元素,由於此時節點5沒有子結點則一種彈出直到有子結點的節點10,則從棧頂到(輸出8,6,5,7)

此時棧頂到棧頂10

7 彈出並輸出棧頂節點元素10,此時將其左右子節點入棧s,此時棧頂到棧底9,11(輸出8,6,5,7,10)

8.由於節點9和11都沒有子節點則一直彈出並輸出(輸出8、6、5、7、10、9、11)

**實現如下:

(函式preorder為遞迴先序遍歷函式,preordernew為非遞迴先序遍歷函式)

1 #include 2 #include 3

using

namespace

std;45

struct

binarytreenode6;

1112

13void createtree(binarytreenode**root)

1422

else

2329}30

3132

void preorder(binarytreenode*root)

3341

42void preordernew(binarytreenode*root)

4361

62if(temp->m_pleft!=null)

6366}67

68}6970

intmain()

71

執行結果:

非遞迴先序遍歷二叉樹 2

非遞迴先序遍歷二叉樹 include define maxsize 100 typedef char datatype 二叉鍊錶型別定義 typedef struct binnode binnode,bintree 順序棧型別定義 typedef struct seqstk 初始化棧 int ini...

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

題目描述 從鍵盤接收擴充套件先序序列,以二叉鍊錶作為儲存結構,建立二叉樹。採取非遞迴方法輸出這棵二叉樹的先序 中序遍歷序列。樣例輸入 abc de g f 樣例輸出 abcdegf cbegdfa 實現 include include define max 100 typedef struct no...

二叉樹先序遍歷(c語言,非遞迴)

已知二叉樹按照二叉鍊錶方式儲存,利用棧的基本操作寫出先序遍歷非遞迴形式的演算法 void pre order bitree root 在遍歷過程中,pre order函式需要呼叫 visit node 函式來實現對結點的訪問,該函式宣告如下 void visit node bitnode node ...