Input:
多组测试数据,每组第一行输入一个整数n(n<100)。接下来输入这个树的前序,和中序遍历。
Output:
将其后序遍历输出,并换行。
Input:
7
1 2 4 5 3 6 7
4 2 5 1 6 3 7
7
1 2 3 4 5 6 7
3 2 4 1 6 5 7
Output:
4 5 2 6 7 3 1
3 4 2 6 7 5 1
由先序和中序可以轻松找到树得根节点和子树,用哈希表储存根节点的位置,然后去把树构建出来(这里卡了我半天),最后是后序的遍历输出()。
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<vector>
using namespace std;
struct tree
{
int val;
tree* right;
tree* left;
tree(int x) : val(x), left(nullptr), right(nullptr) {}//赋初值
};
tree* pretree(int prestart, int preend,int instart, int inend,vector<int>& a,vector<int>& b, unordered_map<int, int>& m)
{
if(prestart > preend || instart > inend) return nullptr;
int rootVal =a[prestart];//根节点值
tree *s=new tree(rootVal);//动态内存分配(将新创建的 TreeNode 对象的地址赋值给指针 root)
int root=m[rootVal]; //根节点在中序遍历中的位置
int rootn=root-instart; //左子树的个数
s->left=pretree(prestart+1,prestart+rootn,instart,root-1,a,b,m);
s->right=pretree(prestart+rootn+1,preend,root+1,inend,a,b,m);
return s;
}
// void create(tree *s,vector<int>& result)//后序遍历
// {
// if (s == nullptr) return;
// create(s->left,result); // 遍历左子树
// create(s->right,result);
// //result.push_back(s->val); //根节点
// }
void create(tree *s)//后序遍历
{
if (s == nullptr) return;
create(s->left); // 遍历左子树
create(s->right);
cout<< s->val; //根节点
}
int main()
{
int n;
while(cin>>n)
{
vector<int> a(n+1), b(n+1);
unordered_map<int,int> m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++) m[b[i]]=i;
tree *s=pretree(1,n,1,n,a,b,m);
vector<int> result;
create(s);
// create(s,result);
// for (int i = 0; i < result.size(); i++) {
// cout << result[i];
// if (i != result.size() - 1) cout << " ";
// }
cout << endl;
}
return 0;
}
1440

被折叠的 条评论
为什么被折叠?



