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
Pop
Sample Output:
3 4 2 6 5 1
代码样例:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 30
typedef int ElementType;
/* Push是按照先序遍历,Pop是中续遍历,记录可得后续遍历 */
/* 定义三个数组,前中后,定义为全局变量方便操作 */
ElementType PreL[MAXSIZE], InL[MAXSIZE], PostL[MAXSIZE];
void GetPostL( int PreP, int InP, int PostP, int n);
int main()
{
char s[10];
int n,i,PreTop = 0,InTop = 0,StackTop = 0;
ElementType num,Stack[MAXSIZE];
scanf("%d",&n);//每个元素都要Push和Pop一次所以要循环2*n次
/* 循环求出前序和中序遍历 */
for( i = 0; i < 2*n; i++){
scanf("%s",&s);
if( !strcmp( s, "Push") ){
scanf("%d",&num);
PreL[PreTop] = num;
Stack[StackTop] = num;
PreTop++;
StackTop++;
}else if( !strcmp( s, "Pop") ){
StackTop--;
InL[InTop] = Stack[StackTop];
InTop++;
}
}
GetPostL(0,0,0,n);
for( i = 0; i < n; i++){
if( i == 0)
printf("%d",PostL[i]);
else
printf(" %d",PostL[i]);
}
}
/* PreP,InP和PreP指的是树最左边(这里递归是分左右树,左右的不相同)*/
void GetPostL( int PreP, int InP, int PostP, int n)
{
if(n == 0) return;
if(n == 1) PostL[PostP] == PreL[PreP];//三个点都相等
ElementType Root;//先找到根,前序遍历的第一个节点
int i,L,R;
Root = PreL[PreP];
PostL[PostP + n - 1] = Root;
for(i = 0; i < n; i++)
if(Root == InL[InP + i]) break;
L = i;//左字数节点数
R = n - L - 1;//右子树节点数
/* 左子树遍历 */
GetPostL( PreP + 1, InP, PostP, L);
/* 右子树遍历 */
GetPostL( PreP + L + 1, InP + L + 1, PostP + L, R);
}