N叉树遍历

E. 雪中楼

西安交通大学下雪了,所有楼顶都被积雪覆盖。

在梧桐道上有 n 座房子,自南向北第i座房子的标号是i,所有房子的高度互不相同。LNC从南向北,依次登上每栋楼楼顶,然后他会回头观察他已经到达过的房子,并记录下这些房子中,比当前他所在房子矮的所有房子中,最高的房子的编号,记为ai。特殊的,当没有房子比当前房子矮的时候,ai=0。

现在给你所有的ai,要求你还原出所有楼的大小关系。由于高度的具体值未知,你只需要按照高度从低到高,输出房子编号。

可以证明对于任何合法的输入,均存在唯一解。

输入格式

输入第一行一个正整数n(1≤n≤2×10^5),代表房子个数。

接下来一行n个非负整数ai,满足0≤ai<i,两两之间用空格隔开。

输出格式

输出一行n个正整数构成的排列,用空格隔开,表示最终的答案。

样例

输出
cpp 复制代码
 5
 0 0 0 0 2
输出
cpp 复制代码
4 3 2 5 1
提示

假设高度是一个 1 ∼ n 的排列,那么可以发现高度为 5,3,2,1,4 是唯一的解,按照高度排名输出得到

4, 3,2,5,1。

AC代码

cpp 复制代码
//代码1
#include<bits/stdc++.h>
using namespace std;
vector<vector<int> >a;
vector<int>b;
int cnt=0;
void dfs(int u)//类似于遍历前序
{
	b[u]=cnt++;
	vector<int> &now=a[u];
	for(int i=now.size()-1;i>=0;i--)	dfs(now[i]);
}
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n;cin>>n;
	a=vector<vector<int> >(n+1);
	b=vector<int>(n+1);
	for(int i=1;i<=n;i++)
	{
		int x;cin>>x;
		a[x].push_back(i);//建立N叉树
	}
	dfs(0);
	vector<pair<int,int> >ans;
	for(int i=1;i<=n;i++)
	{
		ans.push_back({b[i],i});
	}
	sort(ans.begin(),ans.end());
	for(int i=0;i<ans.size();i++)
	{
		cout<<ans[i].second<<' ';
	}
	return 0;
}
//代码2
#include<bits/stdc++.h>
using namespace std;
vector<vector<int> >a;
int cnt=0,ans[200010],b[200010];
void dfs(int u)
{
	b[u]=cnt++;
	vector<int> &now=a[u];
	for(int i=now.size()-1;i>=0;i--)	dfs(now[i]);
}
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n;cin>>n;
	a=vector<vector<int> >(n+1);
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		a[x].push_back(i);
	}
	dfs(0);
	for(int i=1;i<=n;i++)	ans[b[i]]=i;
	for(int i=1;i<=n;i++)	cout<<ans[i]<<' ';
	return 0;
}
相关推荐
2301_789015626 小时前
Linux基础指令(一)
linux·运维·服务器·c语言·开发语言·c++·linux指令
tankeven7 小时前
C++ 继承完全指南
c++
tankeven7 小时前
动态规划专题(11):区间动态规划之三角剖分问题
c++·算法·动态规划
zhangrelay7 小时前
三分钟云课实践速通--C/C++程序设计--
linux·c语言·c++·笔记·学习·ubuntu
小此方7 小时前
Re:从零开始的 C++ STL篇(十二)深度解析哈希函数设计、负载因子调节与两种冲突处理策略
c++·算法·哈希算法
Karle_7 小时前
为AI编辑器准备c++编译环境,onnxruntime、cmake、cl,网上坑太多备份记录后续方便使用。
开发语言·c++·编辑器
lcj25117 小时前
【数据结构精讲】堆与二叉树从底层原理到代码落地:堆的构建 / 调整 / 排序 + 二叉树遍历 / 操作(附完整 C++ 源码 + LeetCode 题解)
数据结构·c++·leetcode
努力努力再努力wz7 小时前
【MySQL 进阶系列】C/C++ 如何通过客户端库访问 MySQL?从连接原理到 API 调用流程详解(附完整demo代码)
服务器·c语言·数据结构·数据库·c++·b树·mysql
CSCN新手听安8 小时前
【Qt】Qt窗口(七)QColorDialog颜色对话框,QFileDialog文件对话框的使用
开发语言·c++·qt
A charmer8 小时前
从 C++ 到 Objective-C:零基础平滑转学专栏【总目录】
开发语言·c++·objective-c