PAT (Advanced Level) Practice 1086

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

猜你喜欢

转载自blog.csdn.net/a568283992/article/details/82284215