/* 由树的先序遍历,中序遍历,求树的后序遍历。 使用栈stack作为辅助数据结构,后序遍历是“左右中”,进栈顺序是“中右左”,与之正好相反。 用visit[]表示该点的后续结点是否被访问过。如已被访问过,该点退栈,如未被访问过,其子结点进栈。 叶子结点直接输出,不用将NULL进栈。 */ #include "stdio.h" #include "stdlib.h" #include "string.h" #include "math.h" #define MAXN 100 typedef struct node { char ch; struct node *left,*right; }tree; tree *create(char *str1,char *str2,int len) { int i; tree *p; if (len<=0)return NULL; p = (tree*)malloc(sizeof(tree)); for (i=0;i<len;i++) { if (str2[i] == str1[0]) break; } p->ch = str1[0]; p->left = create(str1+1,str2,i); p->right = create(str1+i+1,str2+i+1,len-1-i); return p; } int main() { int cnt,visit[MAXN]; char str1[MAXN],str2[MAXN]; tree *root,*p,*q,*stack[MAXN]; //freopen("2255in.txt","r",stdin); //freopen("2255out_.txt","w",stdout); while (scanf("%s%s/n",str1,str2)!=EOF) { root = create(str1,str2,strlen(str1)); cnt = 0; stack[cnt] = root; //根结点进栈 visit[cnt] = 0; cnt++; while (cnt!=0) { if (visit[cnt-1]==0) //未访问叶子结点 { p = stack[cnt-1]->left; q = stack[cnt-1]->right; visit[cnt-1] = 1; //标记已访问叶子结点 } else { printf("%c",stack[cnt-1]->ch); //叶子结点已访问过,直接输出 cnt--; continue; } if (p==NULL && q==NULL) //输出叶子结点 { printf("%c",stack[cnt-1]->ch); cnt--; continue; } if (q) //右结点先进栈 { stack[cnt] = q; visit[cnt] = 0; cnt++; } if (p) { stack[cnt] = p; visit[cnt] = 0; cnt++; } } printf("/n"); } return 0; } /*样例输入: DBACEGF ABCDEFG BCAD CBAD 样例输出: ACBFGED CDAB */