生成N个二进制位的组合

来源:互联网 发布:婚纱照相册排版软件 编辑:程序博客网 时间:2024/05/17 02:58
#include "stdafx.h"#include "stdlib.h"#include "stdio.h"#include <iostream>#include <Windows.h>#define MaxSize 1000using namespace std;typedef struct node{    int num;    node * lchild;    node * rchild;};struct chain{    node * Node;    chain * next;}*head;typedef struct Stack{    int data[MaxSize];    int top;};void postOrder(node *T,Stack s){    if(T != NULL)    {        s.top++;        s.data[s.top] = T->num;        if(T->lchild == NULL && T->rchild == NULL){            for(int i = s.top; i > 0; i--){                cout << s.data[i];            }            cout << endl;        }        postOrder(T->lchild,s);        postOrder(T->rchild,s);    }}//每次新添加的节点加入链表尾部。void AddNode(int Num){    node * NewNode = (node*)calloc(1,sizeof (node));    NewNode->num = Num;    node * FatherNode = head->Node;    if(FatherNode->lchild == NULL)        FatherNode->lchild = NewNode;    else if(FatherNode->rchild == NULL)    {        FatherNode->rchild = NewNode;        //如果右节点也添加了,则链表头移到下一个        head = head->next ;    }    else        return;    chain *tail = head;    //找到链表尾    while (tail->next != NULL)        tail = tail->next;    //添加新节点到链表尾    chain *Newtail = (chain*)calloc(1,sizeof (chain));    Newtail->Node = NewNode;    tail->next = Newtail;}int main(){    //根节点    int k = 0; // k层    node * root=(node*)calloc(1,sizeof (node));    root->num=1;    head=(chain*)calloc(1,sizeof (chain));    head->Node =root;    head->next =NULL;    cout << "请输入N(N个二进制位,取值范围大于等于1):" << endl;    cin >> k;    k = pow(2.0,k + 1) - 1;    for(int N = 2;N <= k;N++){        int tmp = N % 2;        AddNode(tmp);    }    Stack s;    s.top = -1;    postOrder(root,s);    system("pause");    return 0;}

参考:http://www.oschina.net/code/snippet_217193_12485

算法分为两个部分。第一,利用二叉树存储01值,在这部分中最重要的一点是利用了一个单链表保存树的每个节点。第二,就是利用栈作为组合的显示输出(其实是反方向输出,先进先显示)。

参考资料中的二叉树的生成方法不仅仅是满二叉树的生成方法。正如他说是按层生成树,我感觉不一定要是满二叉树。不过我的问题结构就是满二叉树。

0 0
原创粉丝点击