private function removeIn(RedBlackTree $t, $key)
 {
     if ($this->compare($key, $t->key()) < 0) {
         if (!$this->isRed($t->left()) && !$this->isRed($t->left()->left())) {
             $t = $this->moveRedLeft($t);
         }
         $t = new self($t->key(), $t->value(), $t->left()->remove($key), $t->right(), $t->color(), $t->isRoot());
     } else {
         if ($this->isRed($t->left())) {
             $t = $this->rotateRight($t);
         }
         if ($this->compare($key, $t->key()) === 0 && $t->right()->isEmpty()) {
             return self::createEmpty();
         }
         if (!$this->isRed($t->right()) && !$this->isRed($t->right()->left())) {
             $t = $this->moveRedRight($t);
         }
         if ($this->compare($key, $t->key()) === 0) {
             $min = $this->minIn($t->right());
             $t = new self($min->key(), $min->value(), $t->left(), $this->removeMinIn($t->right()), $t->color(), $t->isRoot());
         } else {
             $t = new self($t->key(), $t->value(), $t->left(), $t->right()->remove($key), $t->color(), $t->isRoot());
         }
     }
     return $this->balance($t);
 }