有1-n个节点, 每两个节点可以合并产生一个新的节点, 枚举一下这样的二叉树。
思路: 采用递归的方式, 每次选择已有的节点里面选择两个点进行合并,
最多有2*n-1个节点(满二叉树的性质),define maxn = 2 * n;
cur = n
for (int i = 0; i < n; i++) {
ok[i++] = 1;
}
build_tree(1)
void build_tree(dep) {
if (dep == n) return;
for (int i = 0; i < maxn; i++) {
if (ok[i]) {
for (int j = 0; j < maxn; j++) {
if (ok[j] && i != j) {
ok[i] = ok[j] = 0;
int id = cur++;
w[id ] = w[i] + w[j];
ok[id] = 1;
build_tree(dep + 1);
ok[cur--] = 0;
ok[i] = ok[j] = 1;
}
}
}
}
}
网友评论