PAT 1086. Tree Traversals Again (25)

来源:互联网 发布:靠谱韩代 淘宝店 良心 编辑:程序博客网 时间:2024/05/01 08:10

1086. Tree Traversals Again (25)

时间限制
200 ms
内存限制
32000 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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:
6Push 1Push 2Push 3PopPopPush 4PopPopPush 5Push 6PopPop
Sample Output:
3 4 2 6 5 1思路:根据根左右和左根右的顺序,构造树,再用左右根的顺序遍历
#include <stdio.h>#include <string.h>#include <vector>using namespace std;int N, X, pre[50], in[50];char op[10];vector<int> list, post_order;struct Node{int val;Node *left, *right, *root;};Node * fun(int *pre_order, int *in_order, int length){if(length == 0){return NULL;}int val = pre_order[0], index = 0;for(int i = 0; i < length; i++){if(pre_order[0] == in_order[i]){index = i;break;}}Node *newNode = new Node();newNode->val = pre_order[0];newNode->left = fun(pre_order + 1, in_order, index);newNode->right = fun(pre_order + index + 1, in_order + index + 1, length - 1 - index);return newNode;}void post(Node *root){if(root == NULL){return;}post(root->left);post(root->right);post_order.push_back(root->val);}int main(){while(scanf("%d", &N) != EOF){Node *root;int index_pre = 0, index_in = 0;for(int i = 0; i < N * 2; i++){scanf("%s", &op);if(strcmp(op, "Push") == 0){scanf("%d", &X);pre[index_pre++] = X;list.push_back(X);}else{in[index_in++] = list.back();list.pop_back();}}root = fun(pre, in, index_pre);post(root);printf("%d", post_order[0]);for(int i = 1; i < index_pre; i++){printf(" %d", post_order[i]);}printf("\n");}return 0;}

 
0 0
原创粉丝点击