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.
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 PopSample 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; }