1086.Tree Traversals Again

题目描述

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

考点

前序中序转后序

思路

1.输入
~scanf("%s", str)表示输入的字符的个数,可用于作为循环终止的条件。pushpop的长度不同,因此可以判断输入的字符长度来确认是哪一个。
2.注意点
值得注意的是,push的值的顺序就是前序遍历,可能会忽略这一点。

代码

#include 
#include 
#include 
#include 
#include 
using namespace std;
vector pre, in, post, value;
int n;
void postorder(int r,int s,int e) {
    if (s > e)return;
    int i = s;
    while (i < e&&in[i] != pre[r])i++;
    postorder(r + 1, s, i - 1);
    postorder(r + 1 + i - s, i + 1, e);
    post.push_back(pre[r]);
}
int main() {
    int i, j, m, key=0;
    char str[5];
    stack s;
    cin >> n;
    while (~scanf("%s", str)) {
        if (strlen(str) == 4) {
            int num;
            cin >> num;
            value.push_back(num);
            pre.push_back(key);
            s.push(key++);
        }
        else {
            in.push_back(s.top());
            s.pop();
        }
    }
    postorder(0, 0, n - 1);
    printf("%d", value[post[0]]);
    for (int i = 1; i < n; i++)
        printf(" %d", value[post[i]]);
    return 0;
}

你可能感兴趣的:(1086.Tree Traversals Again)