二叉树-求{0,1....n-1}的非空子集

来源:互联网 发布:ubuntu中查看文件夹 编辑:程序博客网 时间:2024/04/29 12:07

今天有同学问了下我怎么编程实现求集合{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()了。。。。这是个不好的习惯。下次有空加上。
求非空子集合还可以用二进制或者递归这两种方法解决。但是我刚好学了二叉树,就当巩固了。

0 0
原创粉丝点击