Suppression of "6 numbers" limit. New option to choose tree type.

This commit is contained in:
2021-01-28 11:01:29 +01:00
parent 9ee0453611
commit 26dc599d88
6 changed files with 81 additions and 36 deletions

64
tree.c
View File

@@ -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);