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.
#include <iostream>
#include<cstdlib>
using namespace std;
void BuildArray(int pre[], int in[], int N);
void Solve(int pre[], int in[], int post[], int preL, int inL, int postL, int N);
int main()
{
int pre[30], in[30], post[30];
int N, i;
cin >> N;
BuildArray(pre, in, N);
Solve(pre, in, post, 0, 0, 0, N);
cout << post[0];
for (i = 1; i < N; i++) {
cout << " " << post[i];
}
return 0;
}
void BuildArray(int pre[], int in[], int N)
{
int top = -1, i = -1, j = -1; //分别是stack指针,pre指针,in指针
int Stack[30];
string str;
int data, cnt=0;
do {
cin >> str;
if (str == "Push") {
cin >> data;
Stack[++top] = data;
pre[++i] = data;
}
else if (str == "Pop") {
in[++j] = Stack[top--];
cnt++;
}
} while (cnt != N);
}
void Solve(int pre[], int in[], int post[], int preL, int inL, int postL, int N)
{
if (N == 0) return; //递归到最右的右边时return
if (N == 1) {
post[postL] = pre[preL]; //只有一个节点时,直接填入
return;
}
int root, i, L, R;
root = pre[preL]; //前序第一个值为根节点
post[postL + N - 1] = root; //容量中最后一个节点为根节点
for (i = 0; i < N; i++)
if (in[inL + i] == root) break; //中序中找到root所在位置
L = i; //左节点个数为中序root左边
R = N - i - 1; //右节点个数为中序root右边
Solve(pre, in, post, preL + 1, inL, postL, L); //左子树递归
Solve(pre, in, post, preL + L + 1, inL + L + 1, postL + L, R); //右子树递归
}