working version: displays only bests results so far.

This commit is contained in:
2021-01-23 14:33:55 +01:00
parent 9f14b5e076
commit 0931d679fa
7 changed files with 246 additions and 111 deletions

124
tree.c
View File

@@ -60,26 +60,75 @@ void print_node(node, side, depth, details)
{
int i;
if (details) {
/* left padding */
for (i=0; i<=depth; ++i)
printf(" ");
printf("%c: type:%s ", side, node->type==TREE_NODE? "node": "leaf");
if (details) {
printf("op=%c val=%d eval=%d", node->op, node->val, node->eval);
}
putchar('\n');
} else {
if (node->type==TREE_NODE) {
printf("* ");
} else {
printf("x ");
}
if (!node)
return;
switch (details) {
case 1:
if (node->type==TREE_NODE) {
printf("%c ", node->op);
} else {
printf("%d ", node->val);
}
print_node(node->left, TREE_LEFT, depth+1, details);
print_node(node->right, TREE_RIGHT, depth+1, details);
break;
case 0:
print_node(node->left, TREE_LEFT, depth+1, details);
print_node(node->right, TREE_RIGHT, depth+1, details);
if (node->type==TREE_NODE) {
printf("%c ", node->op);
} else {
printf("%d ", node->val);
}
break;
case 3:
if (node->type==TREE_NODE) {
if (!depth) {
printf("(%c", node->op);
//printf("(op");
} else {
//printf(" (op");
printf(" (%c", node->op);
}
} else {
printf(" %d", node->val);
}
print_node(node->left, TREE_LEFT, depth+1, details);
print_node(node->right, TREE_RIGHT, depth+1, details);
if (node->type==TREE_NODE) {
printf(")");
}
break;
case 4:
if (node->type==TREE_NODE) {
printf("(");
}
print_node(node->left, TREE_LEFT, depth+1, details);
if (node->type==TREE_NODE) {
printf(" %c ", node->op);
} else {
printf("%d", node->val);
}
print_node(node->right, TREE_RIGHT, depth+1, details);
if (node->type==TREE_NODE) {
printf(")");
}
break;
case 2:
/* left padding */
for (i=0; i<=depth; ++i)
printf(" ");
printf("%c: type:%s ", side, node->type==TREE_NODE? "node": "leaf");
if (details) {
printf("op=%c val=%d eval=%d", node->op, node->val, node->eval);
}
putchar('\n');
print_node(node->left, TREE_LEFT, depth+1, details);
print_node(node->right, TREE_RIGHT, depth+1, details);
break;;
}
if (node->left)
print_node(node->left, TREE_LEFT, depth+1, details);
if (node->right)
print_node(node->right, TREE_RIGHT, depth+1, details);
}
void print_tree(tree, details)
@@ -87,16 +136,18 @@ void print_tree(tree, details)
int details;
{
int i;
if (details) {
printf("Tree [%s] nodes:%d leaves:%d depth:%d\n",
tree->name, tree->nodes, tree->leaves, tree->depth);
print_node(tree->head, TREE_TOP, 0, 1);
} else {
printf("Tree [%s] : ", tree->name);
print_node(tree->head, TREE_TOP, 0, 0);
// for (i=0; )
printf("\n");
switch (details) {
case 2:
print_node(tree->head, TREE_TOP, 0, details);
break;
case 0:
case 1:
case 3:
case 4:
//printf("Tree [%s] : ", tree->name);
print_node(tree->head, TREE_TOP, 0, details);
printf("\n");
break;
}
}
@@ -201,10 +252,12 @@ void gen_tree(seq, n, nb1, nb0)
if((nb1 + nb0) == 2*n) { /* end */
seq[2*n] = 0;
ntrees++;
# ifdef DEBUG1
printf("tree %d desc=", ntrees);
for (i=0; i<=2*n; ++i)
printf("%d", seq[i]);
putchar('\n');
# endif
sprintf(name, "Tree %d", ntrees);
tree=new_tree(name);
tree->head=build_tree(seq, 2*n+1);
@@ -243,11 +296,20 @@ main(ac, av)
int ac;
char **av;
{
int n;
int n, details=0;
int array[1024];
if (ac<2 || ac>3) {
fprintf(stderr, "usage: %s nodes [type]\n", *av);
fprintf(stderr, "type can be 0 (RPN, default, 1 (polish), 2 (details), 3 (lisp notation), 4 (parenthesed notation)\n");
exit (1);
}
if (ac==3) {
details=atoi(av[2]);
}
n=atoi(av[1]);
gen_tree(array, n, 0, 0);
print_trees(1);
print_trees(details);
exit(0);
}
#endif