R_API struct btree_node *btree_hittest(struct btree_node *root, struct btree_node *hn) { struct btree_node *p = root; if (root != NULL) { struct btree_node *ml = btree_hittest(root->left, root); struct btree_node *mr = btree_hittest(root->right, root); if (ml && ml->hits > p->hits) p = ml; if (mr && mr->hits > p->hits) p = mr; } return p; }
R_API int btree_optimize(struct btree_node **T, BTREE_CMP(cmp)) { struct btree_node *node, *NT = NULL; do { node = btree_hittest(*T, NULL); if (node) { btree_add (&NT, node->data, cmp); btree_del (*T, node->data, cmp, NULL); } } while(node); *T = NT; /* replace one tree with the other */ return 0; }
int main() { struct btree_node *n, *bt = NULL; //btree_init(&bt); struct mydata foo = { 10, "hello" }; struct mydata bar = { 20, "world" }; printf("EMPTY TREE: %d\n", btree_empty(&bt)); btree_add(&bt, &foo, mycmp); btree_add(&bt, &bar, mycmp); printf("EMPTY TREE: %d\n", btree_empty(&bt)); printf("==== go search ====\n"); /* find existent data */ struct mydata *p = btree_get(bt, &bar, mycmp); shownode("result for 20: ", p); printf("==== go search ====\n"); /* find unexistent data */ struct mydata nop = { 15, NULL }; p = btree_get(bt, &nop, mycmp); shownode("result for 15: ", p); printf("==== go get hittest ====\n"); n = btree_hittest(bt, NULL); shownode("hitest is: ", p); printf("==== go remove 20 ====\n"); if (btree_del(bt, &bar, mycmp, NULL)) printf("node found and removed\n"); else printf("oops\n"); printf("==== go search ====\n"); /* find existent data */ p = btree_get(bt, &bar, mycmp); shownode("result for 20: ", p); printf("==== go search ====\n"); /* find existent data */ p = btree_get(bt, &foo, mycmp); shownode("result for 10: ", p); btree_cleartree(bt, NULL); return 0; }