先序遍歷非遞迴實現
思路:使用棧來模擬遞迴的操作:迴圈條件:節點不為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 判斷是否...