Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
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;
}