做PTAL2-006 树的遍历 (25 分),自己想了一种不用建树的做法,但最后的样例过不掉,为什么呀?
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
#include<iostream>
#include<unordered_map>
#include<queue>
using namespace std;
unordered_map<int,int> mp;
queue<int> q;
unordered_map<int,int> a;//存的后序遍历节点
unordered_map<int,int> b;//存中序节点的数组下表
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++){
int t;
cin>>t;
b[t]=i;
}
// 空树
if(n==0)return 0;
//非空树
q.push(n-1);
mp[a[n-1]]=1;
while(q.size()){
int t=q.front();
q.pop();
//从后往前找,中序中的左孩子
for(int i=t-1;i>=0;i--){
if(!mp[a[i]]&&b[a[i]]<b[a[t]]){
q.push(i);
mp[a[i]]=1;
break;
}
}
//从后往前找,中序中的右孩子
for(int i=t-1;i>=0;i--){
if(!mp[a[i]]&&b[a[i]]>b[a[t]]){
q.push(i);
mp[a[i]]=1;
break;
}
}
if(q.size()>0)cout<<a[t]<<" ";
else cout<<a[t];
}
puts("");
return 0;
}