working version: displays only bests results so far.
This commit is contained in:
124
tree.c
124
tree.c
@@ -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
|
||||
|
Reference in New Issue
Block a user