非遞迴二叉樹的序列列印練習

2021-07-27 13:17:50 字數 1804 閱讀 5031

請用非遞迴方式實現二叉樹的先序、中序和後序的遍歷列印。

給定乙個二叉樹的根結點root,請依次返回二叉樹的先序,中序和後續遍歷(二維陣列的形式)。

先序遍歷很簡單,

1 申請乙個新的棧記為sta,

2 將頭結點root壓入棧中

3 每次從sta中彈出棧頂結點,記為cur,然後列印cur結點的值,如果cur右孩子不為空的話將cur的右孩子先壓入sta中,最後如果cur的左孩子不為空的話,將cur的左孩子壓入棧中.

4 不斷重複步驟3 直到sta為空

中序遍歷:

1申請乙個新的棧,記為sta,申請乙個變數cur初始時令cur為頭結點.

2先把cur結點壓入棧中,對以cur為結點的整個樹來說,依次把整棵樹的左邊界壓入棧中,即不斷的令cur=cur.left,然後重複步驟二

3不算重複步驟2,直到發現cur為空,此時彈出乙個結點記為node,列印node的值並且讓cur=node.right,然後繼續重複步驟2

4,當sta和cur同時為空時,遍歷結束

尾序遍歷:

1申請乙個棧,記為s1,將頭結點壓入s1中

2從s1中彈出的結點記為cur,然後先把cur的左孩子壓入s1中,然後把cur的右孩子壓入s1中,

3整個過程中每乙個從s1彈出的結點都被放入s2中

4不斷的重複步驟2和步驟3,直到s1為空

5從s2中依次彈出並列印即可

這個和先序遍歷的順序正好相反,因為按照中右左的順序反過來就是左右中正好是尾序遍歷.

還有一種只需要乙個棧的方法.

1申請1個棧記為sta,將頭結點壓入sta中,同時設定兩個變數h,c,在整個流程中,h代表最近一次彈出列印的結點,c代表當前stack的棧頂結點,初始時令h為頭結點,c為null.

2每次令c等於當前sta的棧頂結點,但是不從sta中彈出結點,分為以下3種情況:

1)如果c的左孩子不為空,並且h不等於c的左孩子和右孩子,則將c的左孩子壓入棧中

2)如果情況1不成立,並且c的右孩子不為空,並且h不等於c的右孩子,則把c的右孩子壓入棧中.

3)如果情況1和情況2都不成立,從sta中彈出c並列印,然後令h等於c;

3一直重複步驟2,直到sta為空

/*

struct treenode

};*/

class treetosequence ;

vector

> res;

vector

vec;

firstroot(root,vec);

res.push_back(vec);

vec.clear();

midroot(root,vec);

res.push_back(vec);

vec.clear();

endroot(root,vec);

res.push_back(vec);

return res;

}void midroot(treenode* root,vector

&res)

treenode* temp=sta.top();

res.push_back(temp->val);

sta.pop();

cur=temp->right;

} }

void endroot(treenode* root,vector

&res)

while(!sta2.empty())

}void firstroot(treenode* root,vector

&res)

}};

非遞迴二叉樹的序列列印

請用非遞迴方式實現二叉樹的先序 中序和後序的遍歷列印。給定乙個二叉樹的根結點root,請依次返回二叉樹的先序,中序和後續遍歷 二維陣列的形式 struct treenode class treetosequence 先序遍歷 void preorder treenode root,vector tm...

遞迴二叉樹的序列列印練習

請用遞迴方式實現二叉樹的先序 中序和後序的遍歷列印。給定乙個二叉樹的根結點root,請依次返回二叉樹的先序,中序和後續遍歷 二維陣列的形式 遞迴方法,灰常簡單。struct treenode class treetosequence void firstroot treenode root,vect...

非遞迴二叉樹的遍歷列印

請用非遞迴方式實現二叉樹的先序 中序和後序的遍歷列印。給定乙個二叉樹的根結點root,請依次返回二叉樹的先序,中序和後續遍歷 二維陣列的形式 先序 先序遍歷的規則 根 左 右 先序遍歷的結果 1 2 4 5 3 6 7 舉例說明 1 節點1入棧,彈出 列印 2 將彈出的節點1的右孩子3先入棧,左孩子...