二叉樹遍歷非遞迴實現(借助棧)

2021-09-27 09:39:07 字數 1256 閱讀 4021

先序遍歷非遞迴實現

思路:使用棧來模擬遞迴的操作:迴圈條件:節點不為null,且棧不為空。

如果當前節點不為空,把節點進棧,並且訪問節點(cout),節點指向其左孩子,直至左孩子為空。

這時相當於左子樹已經遍歷完了,我們需要訪問右節點,將當前元素指向棧頂元素右孩子,彈出棧頂元素。

c++**

void preorder(node *r)

p = s.top();

s.pop();

p = p->right;

}}

中序遍歷非遞迴實現

思路:和先序遍歷類似,只不過訪問節點從第一次進棧時訪問變成出棧時訪問。

c++**:

void inorder(node *r)

p = s.top();

s.pop();

cout << p->data << " ";

p = p->right;

}}

後序遍歷非遞迴實現

思路:後序遍歷的難點在於第一次將根節點出棧後,並不能直接訪問,必須訪問其右子樹後才可以。使用乙個狀態棧來儲存棧中元素的狀態,狀態為0暫時不可訪問,狀態為1可以訪問。

c++**

void posorder(node *r)

node *p = s1.top();

if(s2.top() == 0)

else

}}

完整可執行**:
#include #include using namespace std;

struct node

};class bintree

;node* bintree::createbintree()

void bintree::preorder(node *r)

p = s.top();

s.pop();

p = p->right;

}}void bintree::inorder(node *r)

p = s.top();

s.pop();

cout << p->data << " ";

p = p->right;

}}void bintree::posorder(node *r)

node *p = s1.top();

if(s2.top() == 0)

else

}}int main()

遞迴 棧 非遞迴非棧實現二叉樹的遍歷

基於迎春花開365天 利用棧實現二叉樹的先序 中序 後序遍歷的非遞迴操作 以及 alvin qu 非遞迴,不用棧實現二叉樹中序遍歷 的演算法,本人對二叉樹的遍歷做出系統的總結 c 實現 包含先序 中序 後序的遞迴 棧實現 非遞迴非棧實現。其中以雙棧作為輔助資料結構的後序遍歷演算法,於jimolang...

二叉樹遍歷 遞迴 非遞迴實現

先序遍歷中序遍歷 後序遍歷 根結點 左子樹 右子樹 左子樹 根子樹 右子樹 左子樹 右子樹 根結點 先序遍歷 void preorder btree t 中序遍歷 void inorder btree t 後序遍歷 void postorder btree t 遞迴 recursion 就是子程式 ...

用棧實現二叉樹的遍歷(非遞迴)

先實現棧 include include include typedef char elemtype define stacksize 20 typedef struct st stack void init stack stack p 初始化棧 bool is empty stack p 判斷是否...