Example #1
0
tree_t insert_tree(int elt, tree_t tree) {
    if (tree_isEmpty(tree)) return tree_make(elt, tree_make(), tree_make());
    if (elt <= tree_elt(tree)) return tree_make(tree_elt(tree), 
        insert_tree(elt, tree_left(tree)), tree_right(tree));
    return tree_make(tree_elt(tree), 
        tree_left(tree), insert_tree(elt, tree_right(tree)));
}
Example #2
0
bool contained_by(tree_t A, tree_t B) {
    if (!tree_isEmpty(A) && !tree_isEmpty(B)) 
    {
        if (tree_elt(A) == tree_elt(B)) 
        {
            if (contained_by(tree_left(A), tree_left(B)) 
                && contained_by(tree_right(A), tree_right(B))) return true;
        }
        if (contained_by(A, tree_left(B)) 
            || contained_by(A, tree_right(B))) return true;
    }
    if (tree_isEmpty(A) && tree_isEmpty(B)) return true;
    if (tree_isEmpty(A) && !tree_isEmpty(B)) return true;
    return false;
}
Example #3
0
// write all ranges who's depth equals de depth given as argument
void write_with_depth(unsigned int depth, FILE* fp) {
    range_tree_t* node = root;
    unsigned long flags = 0;
    range_t       node_tmp;

    unsigned int cdepth = 0;

    for (;;) {
        range_tree_t* curr = node;

        if (!(flags & done_this) && (cdepth == depth)) {
            memset(&node_tmp, 0, sizeof(range_t));

            node_tmp.left    = (curr->left  != NULL) ? curr->left->id  : UINT_MAX;
            node_tmp.right   = (curr->right != NULL) ? curr->right->id : UINT_MAX;
            node_tmp.start   = curr->start;
            node_tmp.end     = curr->end;
            node_tmp.country = curr->country->id;

            fwrite(&node_tmp, sizeof(range_t), 1, fp);

            curr->id = next_id++;
        }

        node = tree_left(&flags, curr);

        if (node == NULL) {
            node = tree_right(&flags, curr);

            if (node == NULL) {
                node = tree_up(&flags, curr);

                if (node == NULL) {
                    return;
                } else {
                    cdepth--;
                }
            } else {
                cdepth++;
            }
        } else {
            cdepth++;
        }
    }
}
Example #4
0
list_t traversal(tree_t tree) {
    if (tree_isEmpty(tree)) return list_make();
    return append(traversal(tree_left(tree)), 
        list_make(tree_elt(tree), traversal(tree_right(tree))));
}
Example #5
0
int tree_sum(tree_t tree) {
    if (tree_isEmpty(tree)) return 0;
    return tree_elt(tree) + tree_sum(tree_left(tree)) + tree_sum(tree_right(tree));
}