今天有同学问了下我怎么编程实现求集合{0,1….n-1}的非空子集合,我发现这恰好是一棵满二叉树的题,可以用二叉树求解。
代码如下:
#include <iostream>
using namespace std;
#include <stdlib.h>
int n ;
int flag[20];
typedef struct binary_tree
{
int data;
struct binary_tree *lchild, *rchild;
}bin_node, *bin_tree;
void Create(int n, bin_tree &T, int flag) //递归创建二叉树
{
if(n == -1) //n=-1时,二叉树深度到底
{
return ;
}
T = (bin_tree)malloc(sizeof(bin_node));
T->lchild = NULL; //初始化
T->rchild = NULL; //初始化
if(flag == 0) T->data = 0; //左子树赋为0
else T->data = 1; //右子树赋为1
Create(n-1, T->lchild, 0); //递归创建左子树
Create(n-1, T->rchild, 1); //递归创建右子树
}
void pre_view(bin_tree T, int rank) //前序遍历
{
if(T != NULL)
{
flag[rank] = T->data; //将一个分支上的所有结点值记录下来
if(rank == n+1) //深度到底
{
int temp = 0; //判断是否输出回车
for(int i = n+1; i >= 1; i--)
{
if(flag[i] == 1)
{
cout<<n-i+1<<" "; //升序输出子集合
temp = 1;
}
}
if(temp == 1)
{
cout<<endl;
}
}
}
if(T->lchild != NULL)
{
pre_view(T->lchild, rank+1); //递归前序遍历
}
if(T->rchild != NULL)
{
pre_view(T->rchild, rank+1); //递归前序遍历
}
}
int main()
{
int rank = 1;
bin_tree T = NULL;
cin>>n;
n += 1;
Create(n, T, 0);
pre_view(T, rank);
return 0;
}
忘了写free()了。。。。这是个不好的习惯。下次有空加上。
求非空子集合还可以用二进制或者递归这两种方法解决。但是我刚好学了二叉树,就当巩固了。