二叉树生成

时间:2015-01-24 13:12:10

标签: algorithm random tree genetic-programming

我对树数据结构很新。我知道整个结构是如何工作的,但我不确定如何随机生成一个。

例如,要创建深度为3的二叉树,您基本上可以将各个部分逐个放在一起。即:

root = Node()
root.leftChild = Node()
root.rightChild = Node()
root.leftChild.leftChild = 'left'
root.rightChild.rightChild = 'right'

当我想要随机创建彼此之间变化不同的二叉树结构时,上述功能不起作用。通过随机创建树结构我的意思基本上是随机创建一个节点类型,随机分配一个子节点或不指定一个子节点,但最终结果的总深度为N.

有没有人对如何处理此问题有任何建议?我很想看到一些伪代码/算法或任何那种性质的东西。

感谢

1 个答案:

答案 0 :(得分:0)

我写了一个简单的程序来说明我的方法。该程序将生成一个类似二进制堆的结构,将它转换为您的结构将很简单。

#include <iostream>
#include <time.h>
using namespace std;

int main(){

    int maxDepth;    //The max depth of the tree
    int totalNodes;   //The least number of nodes in the tree.
    int realTotalNodes = 0;  //The real number of nodes in the tree.
    cin >> maxDepth >> totalNodes;

    srand(time(NULL));
    int indexMax = (1 << maxDepth) - 1 ;        //Max index of the nodes in the n-depth binary tree.
    bool* nodes = new bool[indexMax + 1];
    memset(nodes, 0, indexMax + 1);
    int lastMax = indexMax, lastMin =1 << (maxDepth - 1);       //Min and Max index of nodes at n-th level

    //First, promise that the tree will be n-level high.
    //That is, create a path from root to n-th level. 

    int lastIndex = (rand() % lastMin) + lastMin;       //Generate a node that is at n-th level.
    while(lastIndex > 0){       //Create its parent, grand-parent, grand-grand-parent...
            nodes[lastIndex] = true;
            realTotalNodes++;
            lastIndex = lastIndex / 2;
            totalNodes--;

    }

    while(totalNodes > 0){
        int currentIndex = rand() % indexMax;       //Randomly generate the leaves in the tree
        totalNodes--;
        while(currentIndex > 0){        //Create its parents...
            if(nodes[currentIndex] == true){    //If some parent exists, then its grand-parents have already been created. 
                break;
            }
            nodes[currentIndex] = true;
            realTotalNodes++;
            currentIndex = currentIndex / 2;
            totalNodes--;
        }
    }

    //Print these stuff.
    int level = 2;
    for(int i = 1 ; i < indexMax ; i++){
        if(nodes[i]){
            cout << i << "\t";
        }
        if(i == level - 1){
            cout << endl;
            level = level * 2;
        }
    }

    return 0;
}