原文链接:我的个人博客
原题链接
1020 Tree Traversals (25分)
考点
树的遍历
思路
根据题目给定的后序序列和中序序列进行建树。再利用层次遍历输出结果
代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<int> Post,In,Pre,ans;
int n;
struct node{
int key;
node *left,*right;
};
//建树
node *Build(node *root,int InLeft,int InRight,int PostLeft,int PostRight){
if(InLeft>InRight) return NULL;
int i=InLeft;
while(In[i]!=Post[PostRight])i++;//找根节点的位置
if(root==NULL){
root = new node();
root->key = In[i];
root->left = NULL;
root->right = NULL;
}
root->left=Build(root->left,InLeft,i-1,PostLeft,PostLeft+(i-InLeft)-1);
root->right= Build(root->right,i+1,InRight,PostLeft+(i-InLeft),PostRight-1);
return root;
}
//层次遍历
void level(node * root){
queue<node*> q;
q.push(root);
while(!q.empty()){
node *temp = q.front();
q.pop();
ans.push_back(temp->key);
if(temp->left!=NULL)q.push(temp->left);
if(temp->right!=NULL)q.push(temp->right);
}
}
int main(){
cin>>n;
Post.resize(n);
In.resize(n);
for(int i=0;i<n;i++)cin>>Post[i];
for(int i=0;i<n;i++)cin>>In[i];
node *tree = NULL;
tree = Build(tree,0,n-1,0,n-1);
level(tree);
for(int i=0;i<ans.size();i++){
cout<<ans[i];
if(i!=ans.size()-1)cout<<" ";
}
return 0;
}