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 树的遍历(建树)的主要内容,如果未能解决你的问题,请参考以下文章

(已知二叉树的中后,先中序两序遍历建树)

团体程序设计天梯赛-练习集L2-006 树的遍历

二叉树的建立和遍历(递归建树&层序遍历建树)

pat 甲级 1086(树的遍历||建树)

1086 Tree Traversals Again (25 分)一般 / 建树 树的遍历

二叉搜索树的建树与遍历