Commit cfca07a

mo khan <mo.khan@gmail.com>
2020-08-28 20:16:06
Start to build a red black tree
1 parent 9746986
src/03/avl_tree.c
@@ -74,7 +74,23 @@ int compare(int a, int b)
   return (a < b) ? -1 : ((a > b) ? 1 : 0);
 }
 
-AVLTree *rebalance(AVLTree *tree, int value) {
+AVLTree *avl_tree_insert(AVLTree *tree, int value) {
+  if (tree == NULL)
+    return avl_tree_initialize(value);
+
+  switch(compare(value, tree->value)) {
+    case -1:
+      tree->left = avl_tree_insert(tree->left, value);
+      break;
+    case 1:
+      tree->right = avl_tree_insert(tree->right, value);
+      break;
+    default:
+      return tree;
+  }
+
+  tree->height = 1 + max(height_of(tree->left), height_of(tree->right));
+
   int balance = balance_of(tree);
   if (balance > 1 && value < tree->left->value)
     return rotate_right(tree);
@@ -95,25 +111,6 @@ AVLTree *rebalance(AVLTree *tree, int value) {
   return tree;
 }
 
-AVLTree *avl_tree_insert(AVLTree *tree, int value) {
-  if (tree == NULL)
-    return avl_tree_initialize(value);
-
-  switch(compare(value, tree->value)) {
-    case -1:
-      tree->left = avl_tree_insert(tree->left, value);
-      break;
-    case 1:
-      tree->right = avl_tree_insert(tree->right, value);
-      break;
-    default:
-      return tree;
-  }
-
-  tree->height = 1 + max(height_of(tree->left), height_of(tree->right));
-  return rebalance(tree, value);
-}
-
 AVLTree *avl_tree_delete(AVLTree *tree, int value) {
   if (tree == NULL)
     return tree;
src/03/avl_tree_test.c
@@ -332,8 +332,11 @@ TestSuite *avl_tree_tests() {
   return x;
 }
 
+TestSuite *rb_tree_tests();
+
 int main(int argc, char **argv) {
   TestSuite *suite = create_test_suite();
   add_suite(suite, avl_tree_tests());
+  add_suite(suite, rb_tree_tests());
   return run_test_suite(suite, create_text_reporter());
 }
src/03/Makefile
@@ -5,8 +5,8 @@ CC=clang
 TEST_LIBS = -lcgreen
 
 BUILDDIR := build
-OBJS := $(addprefix $(BUILDDIR)/,avl_tree.o)
-TEST_OBJS := $(addprefix $(BUILDDIR)/,avl_tree_test.o)
+OBJS := $(addprefix $(BUILDDIR)/,avl_tree.o rb_tree.o)
+TEST_OBJS := $(addprefix $(BUILDDIR)/,avl_tree_test.o rb_tree_test.o)
 
 $(BUILDDIR)/%.o : %.c
 	$(COMPILE.c) $(OUTPUT_OPTION) $<
src/03/rb_tree.c
src/03/rb_tree.h
src/03/rb_tree_test.c
@@ -0,0 +1,13 @@
+#include "rb_tree.h"
+#include <cgreen/cgreen.h>
+#include <string.h>
+
+Ensure(one_equals_one) {
+  assert_that(1, is_equal_to(1));
+}
+
+TestSuite *rb_tree_tests() {
+  TestSuite *x = create_test_suite();
+  add_test(x, one_equals_one);
+  return x;
+}