static TreeNode * insertIntoTree(AVLTree * tree, TreeNode * node, void * data, Boolean * success) { if(node == NULL) return newTreeNode(data); int comparision = tree->compare(data, node->data); if(comparision == 0) { *success = false; return node; } int direction = comparision > 0 ? RIGHT : LEFT; if(direction == RIGHT) { node->right = insertIntoTree(tree, node->right, data, success); } else { node->left = insertIntoTree(tree, node->left, data, success); } updateHeight(node); node = balanceNode(node); return node; }
void test_must_not_delete_any_Parent_node(){ Tree tree = createTree(compareInts); Iterator result; int data[2] = {10,23}; ASSERT(insertIntoTree(&tree, NULL, &data)); ASSERT(insertIntoTree(&tree, &data, &data[1])); ASSERT(0 == deleteFromTree(&tree,&data[0])); disposeTree(&tree); }
void test_must_delete_node_at_second_level(){ Tree tree = createTree(compareInts); Iterator result; int data[2] = {10,23}; ASSERT(insertIntoTree(&tree, NULL, &data)); ASSERT(insertIntoTree(&tree, &data, &data[1])); ASSERT(deleteFromTree(&tree,&data[1])); result = getChildren(&tree, &data); ASSERT(0 == result.hasNext(&result)); disposeTree(&tree); }
void test_must_insert_node_at_second_level(){ Tree tree = createTree(compareInts); int data[] = {5,10,15}; Iterator result; insertIntoTree(&tree, NULL, &data[0]); insertIntoTree(&tree, &data[0], &data[1]); insertIntoTree(&tree, &data[0], &data[2]); result = getChildren(&tree, &data); ASSERT(15 == *(int*)result.next(&result)); ASSERT(10 == *(int*)result.next(&result)); disposeTree(&tree); }
void test_must_insert_root_node(){ Tree tree = createTree(compareInts); int data = 2; int result = insertIntoTree(&tree, NULL, &data); ASSERT(SUCCESS == result); disposeTree(&tree); }
Boolean AVLTree_insert(AVLTree * tree, void * data) { if(tree == NULL || data == NULL) return false; Boolean success = true; tree->rootNode = insertIntoTree(tree, tree->rootNode, data, &success); if(success) tree->numNodes++; return success; }
void test_must_insert_nodes_at_different_levels(){ Tree tree = createTree(compareInts); Iterator it; int data[7] = {10,12,30,4,45,5,50}; ASSERT(insertIntoTree(&tree, NULL, &data[0])); ASSERT(insertIntoTree(&tree, &data[0], &data[1])); ASSERT(insertIntoTree(&tree, &data[1], &data[2])); ASSERT(insertIntoTree(&tree, &data[2], &data[3])); ASSERT(insertIntoTree(&tree, &data[3], &data[4])); ASSERT(insertIntoTree(&tree, &data[4], &data[5])); disposeTree(&tree); }
void test_must_search_element_in_the_tree(){ Tree tree = createTree(compareInts); Iterator result; int data[7] = {10,12,30,4,45,5,50}; ASSERT(insertIntoTree(&tree, NULL, &data[0])); ASSERT(insertIntoTree(&tree, &data[0], &data[1])); ASSERT(insertIntoTree(&tree, &data[1], &data[2])); ASSERT(insertIntoTree(&tree, &data[2], &data[3])); ASSERT(insertIntoTree(&tree, &data[3], &data[4])); ASSERT(insertIntoTree(&tree, &data[4], &data[5])); ASSERT(searchInTree(&tree,&data[4])); ASSERT(searchInTree(&tree,&data[2])); ASSERT(searchInTree(&tree,&data[0])); disposeTree(&tree); }
void test_must_delete_nodes_from_different_levels(){ Tree tree = createTree(compareInts); Iterator result; int data[7] = {10,12,30,4,45,5,50}; ASSERT(insertIntoTree(&tree, NULL, &data[0])); ASSERT(insertIntoTree(&tree, &data[0], &data[1])); ASSERT(insertIntoTree(&tree, &data[1], &data[2])); ASSERT(insertIntoTree(&tree, &data[2], &data[3])); ASSERT(insertIntoTree(&tree, &data[3], &data[4])); ASSERT(insertIntoTree(&tree, &data[4], &data[5])); ASSERT(deleteFromTree(&tree, &data[5])); result = getChildren(&tree, &data[4]); ASSERT(0 == result.hasNext(&result)); disposeTree(&tree); }