Commit 00b9cfe
Changed files (3)
src
src/03/avl_tree.c
@@ -168,7 +168,7 @@ static void print_tree(AVLTree *tree, int level) {
printf(" ");
if (tree) {
- printf("(%d)\n", tree->value);
+ printf("(%d:%d)\n", tree->value, tree->height);
if (!tree->left && !tree->right)
return;
@@ -180,6 +180,16 @@ static void print_tree(AVLTree *tree, int level) {
}
}
+RBTree *avl_tree_to_rb_tree(AVLTree *tree) {
+ if (!tree)
+ return NULL;
+
+ RBTree *rb_tree = rb_tree_initialize(tree->value);
+ rb_tree->left = avl_tree_to_rb_tree(tree->left);
+ rb_tree->right = avl_tree_to_rb_tree(tree->right);
+ return rb_tree;
+}
+
void avl_tree_inspect(AVLTree *tree) {
print_tree(tree, 0);
}
src/03/avl_tree.h
@@ -1,3 +1,5 @@
+#include "rb_tree.h"
+
typedef struct node {
struct node *left;
struct node *right;
@@ -10,3 +12,4 @@ int avl_tree_size(AVLTree *tree);
AVLTree *avl_tree_insert(AVLTree *tree, int value);
AVLTree *avl_tree_delete(AVLTree *tree, int value);
void avl_tree_inspect(AVLTree *tree);
+RBTree *avl_tree_to_rb_tree(AVLTree *tree);
src/03/avl_tree_test.c
@@ -308,6 +308,28 @@ Ensure(delete_returns_a_null_root) {
assert_that(tree, is_equal_to(NULL));
}
+Ensure(to_rb_tree_returns_a_new_red_black_tree) {
+/*
+ (20:3) (20:b)
+ / \ --> / \
+ (15:2) (30:2) (15:r) (30:r)
+ / \ \ / \ \
+(10:1) (17:1) (35:1) (10:b) (17:b) (35:b)
+ */
+ AVLTree *tree = NULL;
+ RBTree *expected = NULL;
+ int items[] = { 20, 15, 30, 10, 17, 35};
+ int length = sizeof(items) / sizeof(items[0]);
+
+ for (int i = 0; i < length; i++) {
+ tree = avl_tree_insert(tree, items[i]);
+ expected = rb_tree_insert(expected, items[i]);
+ }
+
+ RBTree *rb_tree = avl_tree_to_rb_tree(tree);
+ assert_that(rb_equals(expected, rb_tree), is_equal_to(true));
+}
+
TestSuite *avl_tree_tests() {
TestSuite *x = create_test_suite();
add_test(x, initialize_returns_new_tree);
@@ -329,6 +351,8 @@ TestSuite *avl_tree_tests() {
add_test(x, delete_handles_a_complicated_and_large_tree);
add_test(x, delete_handles_a_complicated_and_small_tree);
add_test(x, delete_returns_a_null_root);
+
+ add_test(x, to_rb_tree_returns_a_new_red_black_tree);
return x;
}