Commit 00b9cfe

mo khan <mo.khan@gmail.com>
2020-08-30 19:20:56
feat: add function to convert avl tree to rb tree
1 parent fb0f63d
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;
 }