03-树2 Tree Traversals Again

这题是第二次做了,两次都不是独立完成,不过我发现我第一次参考的程序,也是参考老师(陈越)的范例做出来的。我对老师给的做了小幅修改,因为我不想有全局变量的的存在,所以我多传了三个参数进去。正序遍历每次都是从1到N吗?看题目我认为应该是,结果我错了,我是对比正确的程序一点点修改才发现的,不容易啊。下面是题目及程序

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 typedef struct
 6 {
 7     int * a;
 8     int top;
 9 }SeqStack;
10 
11 void push(SeqStack * pS, int X);
12 int pop(SeqStack * pS);
13 void solve(int * pre, int * in, int * post, int preL, int inL, int postL, int n);
14 
15 int main()
16 {
17 //    freopen("in.txt", "r", stdin); // for test
18     int i, N;
19     scanf("%d", &N);
20     
21     SeqStack S;
22     S.a = (int *)malloc(N * sizeof(int));
23     S.top = -1;
24     int pre[N], in[N], post[N];
25     
26     char chars[5];
27     char * str = chars;
28     int X, pre_index, in_index;
29     pre_index = in_index = 0;
30     for(i = 0; i < 2 * N; i++)
31     {
32         scanf("%s", str);
33         if(strcmp(str, "Push") == 0)
34         {
35             scanf("%d", &X);
36             pre[pre_index++] = X;
37             push(&S, X);
38         }
39         else
40             in[in_index++] = pop(&S);
41     }
42     
43     solve(pre, in, post, 0, 0, 0, N);
44     for(i = 0; i < N; i++)
45     {
46         printf("%d", post[i]);
47         if(i < N - 1)
48             printf(" ");
49         else
50             printf("\n");
51     }
52 //    fclose(stdin); // for test
53     return 0;
54 }
55 
56 void push(SeqStack * pS, int X)
57 {
58     pS->a[++(pS->top)] = X;
59 }
60 
61 int pop(SeqStack * pS)
62 {
63     return pS->a[pS->top--];
64 }
65 
66 void solve(int * pre, int * in, int * post, int preL, int inL, int postL, int n)
67 {
68     int i, root, L, R;
69     
70     if(n == 0)
71         return;
72     if(n == 1)
73     {
74         post[postL] = pre[preL];
75         return;
76     }
77     root = pre[preL];
78     post[postL + n - 1] = root;
79     for(i = 0; i < n; i++)
80         if(in[inL + i] == root)
81             break;
82     L = i;
83     R = n - L - 1;
84     solve(pre, in, post, preL + 1, inL, postL, L);
85     solve(pre, in, post, preL + L + 1, inL + L + 1, postL + L, R);
86 }

An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(); push(4); pop(); pop(); push(5); push(6); pop(); pop(). Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations. Your task is to give the postorder traversal sequence of this tree.


Figure 1

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (<=30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2N lines follow, each describes a stack operation in the format: "Push X" where X is the index of the node being pushed onto the stack; or "Pop" meaning to pop one node from the stack.

Output Specification:

For each test case, print the postorder traversal sequence of the corresponding tree in one line. A solution is guaranteed to exist. All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:

6
Push 1
Push 2
Push 3
Pop
Pop
Push 4
Pop
Pop
Push 5
Push 6
Pop
Pop

Sample Output:

3 4 2 6 5 1
posted @ 2015-04-18 08:41  自由的青  阅读(252)  评论(0编辑  收藏  举报