枚举二叉树

有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;

            }

        }

    }

}

}

你可能感兴趣的:(枚举二叉树)