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

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

  • 相关阅读:
    This theme is released under creative commons licence, all links in the footer should remain intact解决方法 Fred
    增加ubuntu的内存——设置Swap增加内存
    OpenFlow硬件交换机制作及刷机教程
    ubuntu设置中文
    配置树莓派/Linux默认声卡设备
    github基础操作
    Linux手动添加系统环境共享库路径
    Ubuntu登录界面添加root用户登录选项
    python实现树莓派开机自动发送IP到指定邮箱
    语音信号实时采集与处理
  • 原文地址:https://www.cnblogs.com/Key-Ky/p/3428037.html
Copyright © 2011-2022 走看看