Как исправить ошибку в красно - черном дереве(связана с нулевым узлом)

Вот код дерева:

rbtree* null_node = {0, 0, NULL, NULL, NULL, BLACK};

rbtree* rbtree_add(rbtree *root, int key, char *value) {
  rbtree *node, *parent = null_node;
  node = malloc(sizeof(*node));

  while ((node != NULL) && (node != null_node)) {
    node = parent;
    if (key < node->key) 
      node = node->left;
    else if (key > node->key)
      node = node->right;
    else
      return root;
  }
  if (node == NULL) 
    return NULL;
  node->key = key;
  node->value = value;
  node->left = null_node;
  node->right = null_node;
  node->parent = null_node;
  node->color = RED;

  if (parent != null_node) {
    if (key < parent->key)
      parent->left = node;
    else 
      parent->right = node;
  }
  else {
    root = node;
  }
  return fixup_add(root, node);
}

// из википедии правые и левые повороты
void rotate_left(rbtree *node) {
  rbtree *pivot = node->right;

  pivot->parent = node->parent;
  if (node != NULL) {
    if(node->parent->left == node) 
      node->parent->left = pivot;
    else
      node->parent->right = pivot;
  }
  node->right = pivot->left;
  if(pivot != NULL) 
    pivot->left->parent = node;

  node->parent = pivot;
  pivot->left = node;
}

void rotate_right(rbtree *node) {
  rbtree *pivot = node->left;

  pivot->parent = node->parent;
  if (node->parent != NULL) {
    if (node->parent->left == node) 
      node->parent->left = pivot;
    else
    node->parent->right = pivot;
  }
  node->left = pivot->right;
  if(pivot->right != NULL) 
    pivot->right->parent = node;

  node->parent = pivot;
  pivot->right = node;
}

rbtree* fixup_add(rbtree* root, rbtree* node) {
  rbtree* uncle;

  while(node != root && node->parent->parent->color == RED) {
    if (node->parent == node->parent->parent->left) {
      uncle = node->parent->parent->right;
      // случай 1 дядя красный
      if (uncle->color == RED) {
        node->parent->color = BLACK;
        uncle->color = BLACK;
        node->parent->parent->color = RED;
        node = node->parent->parent;
      }
      // случай 2 дядя черный
      else {
        if(node == node->parent->right) {
          node = node->parent;
          rotate_left(node);
          root = node;
        }
        // случай 3 аналогично 2, дядя черный, но node является левым потомком
        node->parent->color = BLACK;
        node->parent->parent->color = RED;
        rotate_right(node->parent->parent);
        root = node;
      }
    }
     //случаи 4-6 симметричны, но node находится в правом поддереве дедушки
    else {
      uncle = node->parent->parent->right;
      if (uncle->color == RED) {
        node->parent->color = BLACK;
        uncle->color = BLACK;
        node->parent->parent->color = RED;
        node = node->parent->parent;
      }
      else {
        if (node == node->parent->left) {
          node = node->parent;
          rotate_right(node);
          root = node;
        }
        node->parent->color = BLACK;
        node->parent->parent->color = RED;
        rotate_left(node->parent->parent);
        root = node;
      }
    }
  }
  return root;
}

int main(void) {
  rbtree* tree = NULL;
  tree = rbtree_add(tree, 5, "Fox");
  printf("%d %s\n", tree->key, tree->value);
}

Как задать нулевые значение для null_node?


Ответы (0 шт):