binary tree compare: multiple solutions solver

This commit is contained in:
2021-01-26 11:52:06 +01:00
parent 2e83f4b833
commit c1d0085217
3 changed files with 71 additions and 12 deletions

28
best.c
View File

@@ -61,14 +61,28 @@ int check_best(res, nops, node, values, ops)
nbests=0; nbests=0;
found=1; found=1;
//return 1; //return 1;
} /*else if (diff == bestdiff && nops == bestops) { } else if (diff == bestdiff && nops == bestops) {
# ifdef DEBUG_BEST // if (nbests) {
printf("NEW BEST SOLUTION (%d): res=%d diff=%d nops=%d\n", nbests+1, res, diff, nops);
print_node(node, TREE_TOP, 0, 0);
# endif
found=2; found=2;
}*/ for (i=0; i<nbests; ++i) {
if (found==1) { if (compare_nodes(node, bests[i].root, 0)) {
found=0;
break;
}
}
# ifdef DEBUG_BEST
if (found==2) {
printf("new diff solution (%d): res=%d diff=%d nops=%d\n",
nbests+1, res, diff, nops);
print_node(node, TREE_TOP, 0, 0);
} else {
printf("skipping duplicate solution (%d): res=%d diff=%d nops=%d\n",
nbests+1, res, diff, nops);
}
# endif
}
//}
if (found) {
set_timer(&(bests[nbests].timer)); set_timer(&(bests[nbests].timer));
bests[nbests].res=res; bests[nbests].res=res;
bests[nbests].diff=diff; bests[nbests].diff=diff;

1
lceb.h
View File

@@ -68,6 +68,7 @@ typedef struct best {
/* tree.c */ /* tree.c */
extern NODE *get_node(); extern NODE *get_node();
extern void free_node(NODE *node); extern void free_node(NODE *node);
extern int compare_nodes(NODE *node1, NODE *node2, int depth);
extern void print_node(NODE *node, char side, int depth, int details); extern void print_node(NODE *node, char side, int depth, int details);
extern void print_tree(TREE *tree, int details); extern void print_tree(TREE *tree, int details);
extern void print_trees(int details); extern void print_trees(int details);

54
tree.c
View File

@@ -54,6 +54,49 @@ void free_node(node)
freenodes=node; freenodes=node;
} }
int compare_nodes(node1, node2, depth)
NODE *node1, *node2;
int depth;
{
int equal=0;
// we must also consider the case n1->left == n2->right, and vice-et-versa.
# ifdef DEBUG_TREE
if (depth==0) {
printf("compare trees: [ ");
print_node(node1, TREE_TOP, 0, 4);
printf(" ] and [ ");
print_node(node2, TREE_TOP, 0, 4);
printf(" ] ");
}
# endif
if (node1->type==node2->type) {
switch (node1->type) {
case TREE_LEAF:
if (node1->val==node2->val)
equal=1;
break;
case TREE_NODE:
if (node1->op == node2->op) {
if (compare_nodes(node1->left, node2->left, depth+1) &&
compare_nodes(node1->right, node2->right, depth+1)) {
equal=1;
} else if (compare_nodes(node1->left, node2->right, depth+1) &&
compare_nodes(node1->right, node2->left, depth+1)) {
equal=1;
}
}
break;
}
}
# ifdef DEBUG_TREE
if (depth==0) {
printf(" = %d\n", equal);
}
# endif
return equal;
}
void print_node(node, side, depth, details) void print_node(node, side, depth, details)
NODE *node; NODE *node;
char side; char side;
@@ -120,7 +163,7 @@ void print_node(node, side, depth, details)
printf(")"); printf(")");
} }
break; break;
case 2: case 2: /* tree */
/* left padding */ /* left padding */
for (i=0; i<=depth; ++i) for (i=0; i<=depth; ++i)
printf(" "); printf(" ");
@@ -181,6 +224,7 @@ TREE *new_tree(name)
return tree; return tree;
} }
NODE *dup_node(src) NODE *dup_node(src)
NODE *src; NODE *src;
{ {
@@ -269,14 +313,14 @@ void gen_reduced_trees(n)
}; };
char *seq4[]= { char *seq4[]= {
"101010100", "101010100",
"110010100", "101100100",
"101100100" "110010100"
}; };
char *seq5[]= { char *seq5[]= {
"10101010100", "10101010100",
"11001010100",
"10110010100",
"10101100100", "10101100100",
"10110010100",
"11001010100",
"11001100100", "11001100100",
"11010010100" "11010010100"
}; };