AOJ ALDS1_7_C 木の巡回

AOJ ALDS1_7_C 木の巡回

問題概要

リンク参照

考察

  • ただただ実装するだけではあるけど今まで書いたことがなかったので勉強になった.
  • 出力と再帰で潜るタイミングを変えれば良い

ソースコード

#include<algorithm>
#include<bitset>
#include<cassert>
#include<cfloat>
#include<climits>
#include<cmath>
#include<deque>
#include<functional>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<unordered_map>
#include<unordered_set>
#include<utility>
#include<vector>
#include<complex>
#include<list>
#include<cstdio>

#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define FORR(i, m, n) for(int i = m;i >= n;i--)
#define SORT(v, n) sort(v, v+n);
#define VSORT(v) sort(v.begin(), v.end());
#define llong long long
#define pb(a) push_back(a)


using namespace std;

typedef long long int ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;




const int INF = 1e9 + 7;


/******************************************************************************************/


vector<int> G[30];
int in[30];

void preParse(int now) {

	if (now == -1) {
		return;
	}
	
	cout << " " << now;
	
	preParse(G[now][0]);
	preParse(G[now][1]);
}


void inParse(int now) {

	if (now == -1) {
		return;
	}

	inParse(G[now][0]);

	cout << " " << now;

	inParse(G[now][1]);
}


void postParse(int now) {

	if (now == -1) {
		return;
	}

	postParse(G[now][0]);
	postParse(G[now][1]);
	cout << " " << now;
}



int main() {

	cin.tie(0);
	ios::sync_with_stdio(false);
	cout << fixed << setprecision(10);

	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int a, b, c;
		cin >> a >> b >> c;
		G[a].push_back(b);
		G[a].push_back(c);

		if (b != -1) {
			in[b]++;
		}
		if (c != -1) {
			in[c]++;
		}
	}


	//root探し
	int root = 0;
	for (int i = 0; i < n; i++)
	{
		if (in[i] == 0) {
			root = i;
			break;
		}
	}

	cout << "Preorder" << endl;
	preParse(root);
	cout << endl;

	cout << "Inorder" << endl;
	inParse(root);
	cout << endl;

	cout << "Postorder" << endl;
	postParse(root);
	cout << endl;
	
	return 0;
}