数据结构1 - 03-树3 Tree Traversals Again
1 #include<stdio.h> 2 #define MAXN 31 3 int a[MAXN],n,flag[MAXN]; 4 void deal(); 5 int main(){ 6 scanf("%d",&n); 7 a[0] = n; 8 flag[0] = n; 9 deal(); 10 return 0; 11 } 12 void deal(){ 13 char op[5]; 14 int data,stack[MAXN]; 15 int i,j,value; 16 stack[0] = 0; 17 for(i=1;i<=n;i++) flag[i]=0; 18 for(i=1;i<=2*a[0];i++){ 19 scanf("%s",op); 20 if(op[1]=='u'){ 21 //push 入栈操作 22 scanf("%d",&data); 23 stack[0]++; 24 stack[stack[0]] = data; 25 } 26 else if(op[1]=='o'){ 27 //pop出栈操作 28 value = stack[stack[0]]; 29 if(flag[value]==0){ 30 flag[value]=1; 31 } 32 else{ 33 while(flag[value]==1){ 34 printf("%d",value); 35 n--; 36 if(n!=0) printf(" "); 37 else printf("\n"); 38 stack[0]--; 39 value = stack[stack[0]]; 40 } 41 flag[value] = 1; 42 } 43 } 44 45 } 46 for(i=stack[0];i>0;i--){ 47 printf("%d",stack[i]); 48 n--; 49 if(n!=0) printf(" "); 50 else printf("\n"); 51 } 52 }
这是根据中序压栈的顺序求后序遍历的题目,中序遍历是左子树访问完后,才输出根节点,然后进行右子树的访问;而后序遍历则是需要等到左右子树都访问完毕后再输出根节点,因此中序遍历出栈的时候只能保证该结点的左子树访问完毕,却不知道右子树什么时候才能访问完毕,因此借助栈,将左子树访问完成的结点打上标记,不压出栈中。