chenxi16

导航

数据结构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 }

这是根据中序压栈的顺序求后序遍历的题目,中序遍历是左子树访问完后,才输出根节点,然后进行右子树的访问;而后序遍历则是需要等到左右子树都访问完毕后再输出根节点,因此中序遍历出栈的时候只能保证该结点的左子树访问完毕,却不知道右子树什么时候才能访问完毕,因此借助栈,将左子树访问完成的结点打上标记,不压出栈中。

posted on 2020-04-01 17:37  chenxi16  阅读(168)  评论(0编辑  收藏  举报