03-树3 Tree Traversals Again (25 分)

 

【mooc上姥姥提供的代码】

#include<cstdio>
#include<stack>
#include<string>
#include<iostream>
using namespace std;
const int maxn=100;
int pre[maxn], in[maxn], post[maxn];

void solve(int PreL, int inL, int postL, int n){
	if(n==0)return;
	if(n==1){
		post[postL]=pre[PreL];
		return;
	}
	int i;
	int root=pre[PreL];
	post[postL+n-1]=root;
	for(i=0; i<n; i++){
		if(in[inL+i]==root)break;
	}
	int L=i, R=n-i-1;
	solve(PreL+1, inL, postL, L);
	solve(PreL+1+L, inL+L+1, postL+L, R);
}
int main(){
	int n, num, i=0, j=0;
	scanf("%d", &n);
	string s;
	stack<int> st;
	for(int z=0; z<2*n; z++){
		cin>>s;
		if(s=="Push"){
			scanf("%d\n", &num);
			st.push(num);
			pre[i++]=num;
		}else{
			num=st.top();
			st.pop();
			in[j++]=num;
		}
	}
	solve(0,0,0,n);
	for(int i=0; i<n; i++){
		printf("%d", post[i]);
		if(i!=n-1)printf(" ");
	}
	return 0;
} 

 

【自己的】大致思路:根据已知条件构建树,构建完成后,采用后序递归遍历树

#include<cstdio>
#include<stack>
#include<string>
#include<iostream>
const int maxn=35;
using namespace std;
struct TNode{
	int left, right;
}T[maxn];
int count=0, n;
void print(int root){
	if(root==-1)return ;
	if(T[root].left!=-1)print(T[root].left);
	if(T[root].right!=-1)print(T[root].right);
	count++;
	printf("%d", root);
	if(count<n/2)printf(" ");
} 
int main(){
	int  num, cnt=0, temp, root, flag=0, first;
	scanf("%d\n", &n);
	for(int i=1; i<=n; i++){//注意题目说角标是从1开始的
		T[i].left=-1;
		T[i].right=-1;
	}
	n=n*2;
	string s;
	stack<int> st;
	for(int i=0; i<n; i++){
		cin>>s;
		if(s=="Push"){
			cin>>num;
			st.push(num);
			if(i==0){
				root=num;
				first=num;
			}else{
				if(flag==0)T[root].left=num;
				else T[root].right=num;
				root=num;
				flag=0;
			}
		}else{
			root=st.top();
			st.pop();
			flag=1;
		}
	} 
	print(first);
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值