不能放弃,坚持!
#include<iostream>
#include<stack>
using namespace std;
struct BiNode{
char data;
BiNode * lchild, * rchild;
};
struct element{
BiNode * ptr;
int flag;
};
//前序创建二叉树
void create(BiNode * &bt){
char ch;
cin >>ch;
if(ch == '#') bt = NULL;
else{
bt = new BiNode; //bt指向一个新生成的节点
bt->data = ch;
create(bt->lchild);
create(bt->rchild);
}
}
void PreOrder(BiNode * bt){
BiNode * p = bt;
stack<BiNode *>s;
while(NULL != p || !s.empty()){
while(NULL != p){
cout<<p->data<<" ";
s.push(p);
p = p->lchild;
}
if(!s.empty()){
p = s.top(); //p指向当前节点的上一个节点
s.pop();
p =p->rchild;
}
}
}
void InOrder(BiNode * bt){
BiNode * p = bt;
stack<BiNode *>s;
while(NULL != p || !s.empty()){
while(NULL != p){
s.push(p);
p = p->lchild;
}
if(!s.empty()){
p = s.top(); //p指向当前节点的上一个节点
s.pop(); //访问完左子树,回退到根节点
cout<<p->data<<" ";
p =p->rchild;
}
}
}
void PostOrder(BiNode * bt){
BiNode * p = bt;
stack<element>s;
element elem;
while(NULL != p || !s.empty()){ //仅当p为空且栈也为空时退出循环
if(NULL != p){ //第一次入栈,访问左子树
elem.ptr = p;
elem.flag = 1;//标记flag为1,表示即将第一次入栈
s.push(elem);//第一次入栈
p = p->lchild;//访问左孩子
}
else{
elem = s.top();
s.pop();
p = elem.ptr; //p指向当前要处理的节点
if(elem.flag == 1){
//flag == 1,说明只访问过左子树,还需要继续访问右子树
elem.flag = 2; //标记flag为2,表示即将第二次入栈
s.push(elem); //第二次入栈
p = p->rchild;//访问右孩子
}else{
//flag == 2,表示左右子树均访问过了
cout <<p->data<<" ";
p = NULL; //访问后,p赋值为空确保下次循环时继续出栈(回退到上一节点)
}
}
}
}
int main(){
BiNode *root;
create(root);
PreOrder(root);
cout<<endl;
InOrder(root);
cout<<endl;
PostOrder(root);
return 0;
}//AB#D##C##