L2-006 树的遍历(建树)
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了L2-006 树的遍历(建树)相关的知识,希望对你有一定的参考价值。
题目连接
https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456
思路
我们只需要西安通过后根遍历和中根遍历进行建树,然后再BFS即可,这里由于点很少(其实是数据水)所以不用指针或者链式前向星,直接莽过去,但是正解应该是直接在递归的过程中就求出层序遍历,或者说是通过指针或者链式前向星建图
代码
暴力建树
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
const int N = 1e5;
int n,post[N],in[N];
vector<int> tree(N,-1);
void build(int root,int start,int ed,int idx)
if(start > ed) return;
int i = start;
while(i < ed && in[i] != post[root]) i++;
tree[idx] = post[root];
build(root - ed + i - 1,start,i - 1,idx * 2);
build(root - 1,i + 1,ed,idx * 2 + 1);
int main()
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i = 1;i <= n; ++i) cin>>post[i];
for(int i = 1;i <= n; ++i) cin>>in[i];
build(n,1,n,1);
vector<int> ans;
for(int i = 1,l = tree.size();i < l; ++i)
if(tree[i] != -1) ans.push_back(tree[i]);
for(int i = 0,l = ans.size();i < l; ++i)
cout<<ans[i]<<" \\n"[i == l - 1];
return 0;
以上是关于L2-006 树的遍历(建树)的主要内容,如果未能解决你的问题,请参考以下文章