题目
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
分析
仔细观察push与pop指令,总结出如下规律:
1.Push:当前结点左孩子为空则插入为左孩子,否则,右孩子为空则插入为右孩子。左孩子优先插入。
将插入结点作为当前结点。
2.Pop:出栈元素为当前结点。
以样例为例:
push 1 2 3:只有左孩子的斜二叉树;
pop pop:当前结点指向最后一个出栈的元素 2;
push 4:为2结点插入右孩子4;
pop pop:当前结点指向最后一个出栈的元素 1;
push 5 6:为1结点插入右孩子5,为5结点插入左孩子6;
pop pop:栈为空,总插入节点数等于n=6,结束操作。
代码
#include<iostream>
#include<cstring>
#include<stack>
#define MAX 10000000
using namespace std;
struct BTNode{
int left,right;
int pos;
}T[MAX];
int flag=0;
int CreatTree(BTNode T[],int n){
for(int i=1;i<=n;i++){
T[i].left=-1;T[i].right=-1;T[i].pos=i;
}
stack<int>s;
int R;
char order[10];
int r,b,step=0;
cin>>order>>r;
s.push(r);R=r;
step++;
while(step<n||!s.empty()){
b=r;
cin>>order;
if(order[1]=='u'){
cin>>r;
s.push(r);step++;
if(T[b].left==-1) T[b].left=r;
else if(T[b].right==-1)T[b].right=r;
}
if(order[1]=='o'){
r=s.top();
s.pop();
}
}
return R;
}
void PostOrder(BTNode T[],int R){
if(T[R].left>=0)
PostOrder(T,T[R].left);
if(T[R].right>=0)
PostOrder(T,T[R].right);
if(flag==0)flag=1;
else cout<<" ";
cout<<T[R].pos;
}
int main(){
int n;
cin>>n;
int R=CreatTree(T,n);
PostOrder(T,R);
return 0;
}