#include<iostream>
#include<stack>
using namespace std;
//定義二叉樹結點鏈式存儲結構
struct BiTNode{
int data;//數據域
struct BiTNode *lchild,*rchild;//左右孩子指針
}*BiTree;
//後序遍歷函數聲明
int PostOrder(struct BiTNode *BiTree);
int main()
{
//初始化結點
struct BiTNode node1,node2,node3,node4,node5,node6,node7,node8,node9,node10,node11;
node1=(struct BiTNode){7,&node2,&node3};
node2=(struct BiTNode){3,&node4,&node5};
node3=(struct BiTNode){6,&node6,&node7};
node4=(struct BiTNode){1,NULL,NULL};
node5=(struct BiTNode){2,NULL,NULL};
node6=(struct BiTNode){4,NULL,NULL};
node7=(struct BiTNode){5,NULL,NULL};
//建樹
BiTree=&node1;
PostOrder(BiTree);
cout << endl;
return 0;
}
//後序遍歷-非遞歸實現
int PostOrder(struct BiTNode *BiTree){
stack<BiTNode*> s;
struct BiTNode* p=BiTree;
struct BiTNode* r=NULL;
while(p||!s.empty()){
if(p){ //走到最左邊
s.push(p);
p=p->lchild;
}
else{ //向右
p=s.top(); //取棧頂結點
if(p->rchild&&p->rchild!=r){ //如果右子樹存在且未被訪問過
p=p->rchild; //轉向右
s.push(p); //壓入棧
p=p->lchild; //再走到最左
}else{ //否則,彈出節點並訪問
p=s.top();
s.pop(); //彈出
cout << p->data << " "; //訪問
r=p; //記錄最近訪問過的結點
p=NULL; //結點訪問完後,重置p指針
}
}//else
}//while
return 0;
}