問.
根と $n$ 個のノードの計 $n+1$ 個のノードからなる順序木を列挙してください。
※順序木 (ordered tree): 根付き木において、上部左のノードから番号が順番になるような木構造。
$n = 4$ のときは以下の 14 通り。
親は複数の子を持ちうるので、親から子に向かって構築する方法はめんどくさい。
根には親がなく、
根ではないノードは親が唯一に決まるので、子から親に向かって構築する方法を採用する。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n;
vector<int> par;
// ノード v の親を何にするか悩んでいる。
// これまでで最も若い親の番号は p.
void f(int v, int p) {
if(v == 0) {
for(int i=0; i<=n; ++i) { if(i) { putchar(' '); } printf("%d", par[i]); } putchar('\n');
return;
}
for(int u=min(p, v-1); u>=0; --u) { // v の親を u にする。
par[v] = u;
f(v-1, min(p, u));
}
}
int main(void) {
scanf("%d", &n);
par.assign(n+1, -1); // v の親が u のとき、par[v] = u とする。
f(n, n);
return 0;
}
ちなみに、パターン数はカタラン数になる。
(ΦωΦ)<
つづく