天天看點

PAT (Advanced Level) 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.

PAT (Advanced Level) 1086. Tree Traversals Again (25) 根據先根周遊數組建立樹

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
      

注意到如果将pop看成數的空結點的話,輸入用例隻要在後面再加一個pop,該序列就與樹的先序周遊一樣。 我們可以用0表示空結點,則先根周遊序列轉換為1,2,3,0,0,4,0,0,5,6,0,0,0,利用該序列先根周遊建立樹即可。

/*2015.7.30cyq*/
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;

//ifstream fin("case1.txt");
//#define cin fin

struct TNode{
	int val;
	TNode *left;
	TNode *right;
	TNode(int x):val(x),left(nullptr),right(nullptr){}//構造函數
};
//根據數組先根周遊建立樹
void createTree(TNode *&root,const vector<int> &ivec,int &cur){
	if(ivec[cur]==0){
		cur++;
	}else{//root指針指向一個new的結點,左右子結點先置為nullptr
		root=new TNode(ivec[cur]);
		cur++;
		createTree(root->left,ivec,cur);
		createTree(root->right,ivec,cur);
	}
}
//後序周遊
void postOrder(TNode *root,vector<int> &result){
	if(root!=nullptr){
		postOrder(root->left,result);
		postOrder(root->right,result);
		result.push_back(root->val);
	}
}
int main(){
	int N;
	cin>>N;
	vector<int> ivec;
	string s;
	int x;
	for(int i=0;i<2*N;i++){
		cin>>s;
		if(s=="Push"){
			cin>>x;
			ivec.push_back(x);
		}else
			ivec.push_back(0);//0表示null結點
	}
	ivec.push_back(0);//最後一個null結點

	TNode *root=nullptr;
	int cur=0;
	createTree(root,ivec,cur);

	vector<int> result;
	postOrder(root,result);

	cout<<result[0];
	for(auto it=result.begin()+1;it!=result.end();it++)
		cout<<" "<<*it;
	return 0;
}