Commit 08d689b

mo khan <mo.khan@gmail.com>
2020-09-02 23:51:16
fix: colour red when node is odd with parent that has even height
1 parent 8ffa9b4
Changed files (1)
src/03/avl_tree.c
@@ -180,16 +180,32 @@ static void print_tree(AVLTree *tree, int level) {
   }
 }
 
-RBTree *avl_tree_to_rb_tree(AVLTree *tree) {
+static bool is_even(int value) {
+  return value % 2 == 0;
+}
+
+static bool is_odd(int value) {
+  return !is_even(value);
+}
+
+RBTree *_avl_tree_to_rb_tree(AVLTree *tree, AVLTree *parent) {
   if (!tree)
     return NULL;
 
-  RBTree *rb_tree = rb_tree_initialize_with(tree->value, tree->height % 2 == 0 ? black : red);
-  rb_tree->left = avl_tree_to_rb_tree(tree->left);
-  rb_tree->right = avl_tree_to_rb_tree(tree->right);
+  enum Colour colour = (parent && is_even(parent->height) && is_odd(tree->height)) ? red : black;
+  RBTree *rb_tree = rb_tree_initialize_with(tree->value, colour);
+  rb_tree->left = _avl_tree_to_rb_tree(tree->left, tree);
+  rb_tree->right = _avl_tree_to_rb_tree(tree->right, tree);
   return rb_tree;
 }
 
+RBTree *avl_tree_to_rb_tree(AVLTree *tree) {
+  if (!tree)
+    return NULL;
+
+  return _avl_tree_to_rb_tree(tree, NULL);
+}
+
 void avl_tree_inspect(AVLTree *tree) {
   print_tree(tree, 0);
 }