生成N个二进制位的组合

#include "stdafx.h"

#include "stdlib.h"
#include "stdio.h"
#include <iostream>
#include <Windows.h>

#define MaxSize 1000

using 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值,在这部分中最重要的一点是利用了一个单链表保存树的每个节点。第二,就是利用栈作为组合的显示输出(其实是反方向输出,先进先显示)。

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

posted @ 2013-11-17 17:11  Key_Ky  阅读(1108)  评论(0编辑  收藏  举报