static int make_huffman_tree(GtHuffman *huffman) { GtHuffmanTree *n1 = NULL, *n2 = NULL, GT_UNUSED *n3 = NULL, *newnode = NULL; unsigned long i, symbol; unsigned long long freq; int GT_UNUSED deleted; bool nodecreated = false; if (huffman->numofsymbols == 0) huffman->roothuffmantree = NULL; else if (huffman->numofsymbols == 1) { huffman->roothuffmantree = gt_rbtree_root_key(huffman->rbt_root); huffman->roothuffmantree->code.code = 0; huffman->roothuffmantree->code.numofbits = 1; } else { for (i = 0; i < huffman->numofsymbols - 1; i++) { n1 = gt_rbtree_minimum_key(huffman->rbt_root); n1 = huffman_tree_ref(n1); deleted = gt_rbtree_erase(huffman->rbt_root, n1); gt_assert(deleted == 0); n2 = gt_rbtree_minimum_key(huffman->rbt_root); n2 = huffman_tree_ref(n2); deleted = gt_rbtree_erase(huffman->rbt_root, n2); gt_assert(deleted == 0); symbol = n1->symbol.symbol < n2->symbol.symbol ? n2->symbol.symbol : n1->symbol.symbol; freq = n1->symbol.freq + n2->symbol.freq; newnode = huffman_tree_new(symbol, freq); if (n1->symbol.freq < n2->symbol.freq) { newnode->leftchild = n2; newnode->rightchild = n1; } else { newnode->leftchild = n1; newnode->rightchild = n2; } gt_assert(huffman->rbt_root); n3 = gt_rbtree_search(huffman->rbt_root, newnode, &nodecreated); gt_assert(nodecreated && n3); } huffman->roothuffmantree = (GtHuffmanTree*)newnode; huffman->roothuffmantree->code.code = 0; huffman->roothuffmantree->code.numofbits = 0; } return 0; }
int gt_rbtree_unit_test(GtError *err) { int had_err = 0; GtRBTree *tree = NULL; GtUword i, j, k, *v; gt_error_check (err); gt_rbtree_xtab = gt_malloc(GT_RBTREE_SIZE * sizeof (*gt_rbtree_xtab)); gt_rbtree_ytab = gt_malloc(2*GT_RBTREE_SIZE * sizeof (*gt_rbtree_ytab)); gt_rbtree_ztab = gt_malloc(GT_RBTREE_SIZE * sizeof (*gt_rbtree_ztab)); gt_rbtree_depths = gt_malloc(GT_RBTREE_SIZE * sizeof (*gt_rbtree_depths)); tree = gt_rbtree_new(nrbt_cmp_fn, NULL, NULL); gt_ensure(tree != NULL); for (i = 0; i < (GtUword) GT_RBTREE_SIZE; ++i) { gt_rbtree_xtab[i] = i; } /* Do this loop several times to get different permutations for the random case. */ for (i = 0; i < (GtUword) GT_RBTREE_PASSES; ++i) { NRBT_MANGLECHECK(GT_RBTREE_ASCENDING, GtRBTreeBuild, 0); NRBT_MANGLECHECK(GT_RBTREE_ASCENDING, GtRBTreeFind, 0); NRBT_MANGLECHECK(GT_RBTREE_DESCENDING, GtRBTreeFind, 0); NRBT_MANGLECHECK(GT_RBTREE_RANDOMORDER, GtRBTreeFind, 0); NRBT_WALKCHECK; NRBT_MANGLECHECK (GT_RBTREE_ASCENDING, GtRBTreeDelete, 0); NRBT_MANGLECHECK (GT_RBTREE_ASCENDING, GtRBTreeBuild, 0); NRBT_WALKCHECK; NRBT_MANGLECHECK (GT_RBTREE_DESCENDING, GtRBTreeDelete, 0); NRBT_MANGLECHECK (GT_RBTREE_ASCENDING, GtRBTreeBuild, 0); NRBT_WALKCHECK; NRBT_MANGLECHECK (GT_RBTREE_RANDOMORDER, GtRBTreeDelete, 0); NRBT_MANGLECHECK (GT_RBTREE_DESCENDING, GtRBTreeBuild, 0); NRBT_MANGLECHECK (GT_RBTREE_ASCENDING, GtRBTreeFind, 0); NRBT_MANGLECHECK (GT_RBTREE_DESCENDING, GtRBTreeFind, 0); NRBT_MANGLECHECK (GT_RBTREE_RANDOMORDER, GtRBTreeFind, 0); NRBT_WALKCHECK; NRBT_MANGLECHECK (GT_RBTREE_DESCENDING, GtRBTreeDelete, 0); NRBT_MANGLECHECK (GT_RBTREE_DESCENDING,GtRBTreeBuild, 0); NRBT_WALKCHECK; NRBT_MANGLECHECK (GT_RBTREE_DESCENDING, GtRBTreeDelete, 0); NRBT_MANGLECHECK (GT_RBTREE_DESCENDING, GtRBTreeBuild, 0); NRBT_WALKCHECK; NRBT_MANGLECHECK (GT_RBTREE_RANDOMORDER, GtRBTreeDelete, 0); NRBT_MANGLECHECK (GT_RBTREE_RANDOMORDER, GtRBTreeBuild, 0); NRBT_MANGLECHECK (GT_RBTREE_ASCENDING, GtRBTreeFind, 0); NRBT_MANGLECHECK (GT_RBTREE_DESCENDING, GtRBTreeFind, 0); NRBT_MANGLECHECK (GT_RBTREE_RANDOMORDER, GtRBTreeFind, 0); NRBT_WALKCHECK; NRBT_MANGLECHECK (GT_RBTREE_RANDOMORDER, GtRBTreeDelete, 0); for (j = 1UL; j < (GtUword) GT_RBTREE_SIZE; j *= 2) { NRBT_MANGLECHECK (GT_RBTREE_RANDOMORDER, GtRBTreeBuildDelete, j); } } for (i = 1UL; i < (GtUword) GT_RBTREE_SIZE; i *= 2) { NRBT_MANGLECHECK (GT_RBTREE_ASCENDING, GtRBTreeBuildDelete, i); NRBT_MANGLECHECK (GT_RBTREE_DESCENDING, GtRBTreeBuildDelete, i); NRBT_MANGLECHECK (GT_RBTREE_ASCENDING, GtRBTreeBuildDelete, i); NRBT_MANGLECHECK (GT_RBTREE_DESCENDING, GtRBTreeBuildDelete, i); NRBT_MANGLECHECK (GT_RBTREE_ASCENDING, GtRBTreeBuildDelete, i); NRBT_MANGLECHECK (GT_RBTREE_DESCENDING, GtRBTreeBuildDelete, i); NRBT_MANGLECHECK (GT_RBTREE_ASCENDING, GtRBTreeBuildDelete, i); NRBT_MANGLECHECK (GT_RBTREE_DESCENDING, GtRBTreeBuildDelete, i); } gt_rbtree_delete(tree); gt_free(gt_rbtree_xtab); gt_free(gt_rbtree_ytab); gt_free(gt_rbtree_ztab); gt_free(gt_rbtree_depths); i = 0; j = 1UL, k = 2UL; tree = gt_rbtree_new(nrbt_cmp_fn, NULL, NULL); v = gt_rbtree_root_key(tree); gt_ensure(!v); (void) gt_rbtree_insert(tree, &i); v = gt_rbtree_root_key(tree); gt_ensure(v == &i); gt_ensure(*v == i); (void) gt_rbtree_insert(tree, &j); (void) gt_rbtree_insert(tree, &k); v = gt_rbtree_root_key(tree); gt_ensure(v == &j); gt_ensure(*v == j); gt_rbtree_delete(tree); return had_err; }