PAT Advanced 1086 【Tree Traversals Again】 (25)

分析:进栈的顺序便是先序遍历,出栈的顺序是中序遍历,由中序+先序即可求后序序列,由于题目说明了结点从1到N编号,因此无重复编号,可用下面做法:

1. 先序:根左右

2. 中序:左根右

3. 后序:左右根

先序的根找到对应中序的根的位置,再递归中序根左边的位置,根右边的位置,最后将根放进数组。

当然也可以先建树再求后序遍历。

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int in[37], pre[37], post[37], len3;
stack<int> s;
void getPost(int prel, int prer, int il, int ir){
	if(prel > prer) return ;
	int mid = il, diff;
	for(mid = il; mid<=ir; mid++){
		if(in[mid] == pre[prel]) break;
	}
	diff = mid-il;
	getPost(prel+1, prel+diff, il, mid-1);
	getPost(prel+diff+1, prer, mid+1, ir);
	post[len3++] = pre[prel];
}
int main(){
	//freopen("aa.txt", "r", stdin);
	int n, m, num, len1 = 0, len2 = 0;
	cin >> n;
	m = 2*n;
	string tem;
	for(int i = 0; i<m; i++){
		cin >> tem;
		if(tem == "Push"){
			cin >> num;
			s.push(num);
			pre[len1++] = num;
		} else {
			in[len2++] = s.top();
			s.pop();
		}
	}
	getPost(0, n-1, 0, n-1);
	for(int i = 0; i<n; i++){
		cout << post[i];
		i != n-1 ? cout << " " : cout << "\n";
	} 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/gq__97/article/details/81988790
今日推荐