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))); }
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; }
// 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++; } } }
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)))); }
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)); }