Description
我们先看百度百科对幂集的定义:
所谓幂集(Power Set), 就是原集合中所有的子集(包括全集和空集)构成的集族。
我们这个题的任务就是将一个集合的幂集解出来。
我们假设原始集合是一个由数字组成的集合,并且是从1~N的连续整数。
输入一个N,则这个集合的内容是{1, 2, 3, ……, N}。
求解幂集之后按照一定的顺序输出出来,这个顺序是这样的:
对于一个集合,我们将集合内的元素按照从大到小排序。
对于两个集合之间,我们按照从小到大排序,如何比较两个集合之间的大小关系呢?
先从左往右比较集合的元素,哪个集合先遇到大于另一个集合的数字,则说明比它大,如果注意空比任何数字都要小,比如:
{2} < {2, 1}
{1} < {2}
{3, 1} < {3, 2}
Input
第一行只有一个整数m,代表有m个测试用例
接下来有m行,每一行是一个测试用例,每个测试用例一个整数,代表N的值(0 < N < 15)。
Output
对于每个用例,输出它的幂集,幂集中的每个集合都占一行,并且没有空格。
Sample Input
2 1 3
Sample Output
{} {1} {} {1} {2} {2,1} {3} {3,1} {3,2} {3,2,1}
本题的解题思路是,建造一颗二叉树,每一层有两个元素,空和n,其中n依次递减。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
typedef struct treenode {
int data;
struct treenode *lchild;
struct treenode *rchild;
bool maxchild;
treenode(int d = 0,
struct treenode *l = NULL,
struct treenode *r = NULL,
bool max = 0) {
data = d;
lchild = l;
rchild = r;
maxchild = max;
}
} treenode;
void creat_node(int n, treenode * root) {
if(n == 1) {
treenode * p = new treenode(0, NULL, NULL, true);
treenode * q = new treenode(n, NULL, NULL ,true);
root->lchild = p;
root->rchild = q;
} else if (n > 1) {
treenode * p = new treenode(0);
treenode * q = new treenode(n);
root->lchild = p;
root->rchild = q;
creat_node(n-1, p);
creat_node(n-1, q);
} else {
return ;
}
}
treenode * creat_tree(int n) {
treenode * root = new treenode;
creat_node(n, root);
return root;
}
void printarray(int * data, int len) {
int i, j;
cout << "{";
for(i = 0, j = 0; i < len; i++) {
if(data[i] != 0)
j = i;
}
if (!data[j]==0) {
for(i = 0; i < j; i++) {
if(data[i] != 0)
cout << data[i] << ",";
}
cout << data[j];
}
cout << "}";
cout << endl;
}
void printPathsRecur(treenode * node, int path[], int pathLen) {
if (node == NULL)
return ;
path[pathLen] = node->data;
pathLen++;
if(node->lchild == NULL && node->rchild == NULL) {
printarray(path, pathLen);
} else {
printPathsRecur(node->lchild, path, pathLen);
printPathsRecur(node->rchild, path, pathLen);
}
}
void powerset(int n) {
treenode * root = creat_tree(n);
int path[1000];
printPathsRecur(root, path, 0);
}
int main() {
int cases;
int n;
cin >> cases;
while(cases--) {
cin >> n;
powerset(n);
}
return 0;
}
来源:数据结构