Suppression of "6 numbers" limit. New option to choose tree type.
This commit is contained in:
64
tree.c
64
tree.c
@@ -39,19 +39,28 @@ NODE *get_node()
|
||||
return ret;
|
||||
}
|
||||
|
||||
void free_node(node)
|
||||
int free_node(node)
|
||||
NODE *node;
|
||||
{
|
||||
if (node->left) {
|
||||
free_node(node->left);
|
||||
int n=0;
|
||||
if (node->type==TREE_NODE) {
|
||||
# ifdef DEBUG_TREE2
|
||||
printf("free tree: ");
|
||||
print_node(node, 3);
|
||||
# endif
|
||||
n+=free_node(node->left);
|
||||
node->left=NULL;
|
||||
}
|
||||
if (node->right) {
|
||||
free_node(node->right);
|
||||
n+=free_node(node->right);
|
||||
node->right=NULL;
|
||||
# ifdef DEBUG_TREE2
|
||||
printf("free tree: ");
|
||||
print_node(node, 3);
|
||||
# endif
|
||||
}
|
||||
node->next=freenodes;
|
||||
freenodes=node;
|
||||
n++;
|
||||
return n;
|
||||
}
|
||||
|
||||
int compare_nodes(node1, node2, depth)
|
||||
@@ -290,7 +299,6 @@ NODE *build_tree(desc, size)
|
||||
node->type=TREE_LEAF;
|
||||
}
|
||||
}
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
@@ -374,36 +382,55 @@ void gen_reduced_trees(n)
|
||||
return;
|
||||
}
|
||||
|
||||
void gen_tree(seq, n, nb1, nb0)
|
||||
void gen_tree(seq, n, nb1, nb0, reduced)
|
||||
char *seq;
|
||||
int n; /* number of nodes */
|
||||
int nb1; /* number of "1" */
|
||||
int nb0; /* number of "0" */
|
||||
int reduced;
|
||||
{
|
||||
char name[80];
|
||||
TREE *tree;
|
||||
NODE *node;
|
||||
int i;
|
||||
|
||||
# ifdef DEBUG_TREE
|
||||
printf("gen_tree(n=%d, nb1=%d, nb0=%d)\n", n, nb1, nb0);
|
||||
# endif
|
||||
if((nb1 + nb0) == 2*n) { /* end */
|
||||
if ((nb1 + nb0) == 2*n) { /* end */
|
||||
seq[2*n] = '0';
|
||||
seq[2*n+1] = 0;
|
||||
ntrees++;
|
||||
sprintf(name, "Tree %d", ntrees);
|
||||
tree=new_tree(name);
|
||||
tree->head=build_tree(seq, 2*n+1);
|
||||
node=build_tree(seq, 2*n+1);
|
||||
if (reduced) {
|
||||
for (i=0; i<ntrees; ++i) {
|
||||
if (compare_nodes(node, nth_tree(i)->head, 0)) {
|
||||
# ifdef DEBUG_TREE
|
||||
printf("gen_tree: skipping unused tree (%d nodes freed)\n", free_node(node));
|
||||
# else
|
||||
free_node(node);
|
||||
# endif
|
||||
node=NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (node) {
|
||||
ntrees++;
|
||||
sprintf(name, "Tree %d", ntrees);
|
||||
tree=new_tree(name);
|
||||
tree->head=node;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(nb1 >= nb0 && nb1 < n) {
|
||||
if (nb1 >= nb0 && nb1 < n) {
|
||||
seq[nb1+nb0] = '1';
|
||||
gen_tree(seq, n, nb1+1, nb0);
|
||||
gen_tree(seq, n, nb1+1, nb0, reduced);
|
||||
}
|
||||
|
||||
if(nb0 < nb1 && nb1 <=n) {
|
||||
seq[nb1+nb0] = '0';
|
||||
gen_tree(seq, n, nb1, nb0+1);
|
||||
gen_tree(seq, n, nb1, nb0+1, reduced);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -444,10 +471,11 @@ int main(ac, av)
|
||||
n=atoi(av[2]);
|
||||
if (type == 0) {
|
||||
printf("generating Calalan tree...\n");
|
||||
gen_tree(array, n, 0, 0);
|
||||
gen_tree(array, n, 0, 0, 0);
|
||||
} else {
|
||||
printf("generating Wedderburn tree...\n");
|
||||
gen_reduced_trees(n);
|
||||
gen_tree(array, n, 0, 0, 1);
|
||||
//gen_reduced_trees(n);
|
||||
}
|
||||
print_trees(details);
|
||||
exit(0);
|
||||
|
Reference in New Issue
Block a user