1086 Tree Traversals Again(25 分)
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
题意的意思是,根据中序的方式给出栈的操作方式,然后让你输出其树的后序遍历。最后不能有多余的空格,这里我使用vector存入数据,然后一次性输出(偷懒)。 这里需要使用last指针来记录最后一次pop的那个节点,因为这个节点被pop了,栈中没有这个节点,所以需要使用一个指针进行记录,后序插入操作的时候需要使用这个节点。
#include<cstdio>
#include<stack>
#include<vector>
#include<cstdlib>
using namespace std;
typedef struct Node{
int val;
struct Node *left, *right;
}*Tree, Node;
Tree t = NULL;
Node *last;
stack<Node *> s;
vector<int> v;
void push(int val){
if(t == NULL){
t = (Node *)malloc(sizeof(Node));
t->left = t->right = NULL;
t->val = val;
last = t;
s.push(t);
}else{
Node *p = (Node *)malloc(sizeof(Node));
p->left = p->right = NULL;
p->val = val;
if(last->left){//last指向为最后一次pop的节点,或者刚插入节点的父节点
last->right = p;
}else{
last->left = p;
}
last = p;
s.push(p);
}
}
void LRD(Tree &t){
if(t){
LRD(t->left);
LRD(t->right);
v.push_back(t->val);
}
}
int main(){
int n;
scanf("%d", &n);
for(int i = 0;i < 2 * n;i++){
char op[10];
scanf("%s", op);
if(op[1] == 'u'){
int num;
scanf("%d", &num);
push(num);
}else{
last = s.top();
s.pop();
}
}
Node *p = t;
LRD(p);
for(int i = 0;i < v.size();i++){
if(i == 0){
printf("%d", v[i]);
} else{
printf(" %d", v[i]);
}
}
return 0;
}