1. 程式人生 > 實用技巧 >3348. 樹的雙親儲存法+多叉樹的遍歷

3348. 樹的雙親儲存法+多叉樹的遍歷

3348. 樹的雙親儲存法

ECNU-3348

/**
 * 這裡不能用鄰接矩陣的形式儲存整個圖,因為可能會出現重邊的問題。
 * 如果是簡單的重邊,取最短邊即可,但是本題需要求出所有的最短路徑,所以更長的邊
 * 對結果會有影響 
 */
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<map> 
#include<vector>
#include<unordered_map>
#include<bitset>
using namespace std;
const int maxn=100005;
int n;
int root;
vector<int>child[maxn];//儲存所有的孩子結點 
vector<int>order;
void postOrder(int cur){
	for(auto i:child[cur]){
		postOrder(i);
	}
	order.push_back(cur);
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		int parent;
		cin>>parent;
		if(parent==-1){
			//i為根節點 
			root=i;
		}else child[parent].push_back(i); 
	}
	postOrder(0);
	int size=order.size();
	for(int i=0;i<size-1;i++){
		cout<<order[i]<<" ";
	} 
	cout<<order[size-1]<<endl;
	return 0;
}