Можно ли вставить несортированные данные в красно-черное дерево? - PullRequest
1 голос
/ 05 июня 2011

Пока я все еще пытаюсь найти решение для этого вопроса, у меня есть еще один, который может быть проще.Ниже приведена функция вставки реализации красно-черного дерева Окасаки.То, что я хочу сделать, это сохранить данные несортированными при вставке в дерево.Таким образом, данные всегда идут к самому левому / самому нижнему листу каждый раз, когда я вставляю.Нет необходимости сравнивать для x y или x == y.Сначала это кажется довольно простым, просто удалив эти охранники и сделав только: ins s @ (T color ayb) = баланс цвета (ins a) y b.Поведение кажется таким, что дерево остается сбалансированным, но окраска становится немного испорченной.И в конечном итоге это влияет на будущие вставки. Есть идеи, как этого достичь?Я думаю, что это может стать первым шагом к моему предыдущему вопросу.Я только начал играть с Haskell, так что я не совсем понял это правильно.Большое спасибо.

insertSet x s = T B a y b
  where ins E = T R E x E
        ins s@(T color a y b) =
          if x < y then balance color (ins a) y b
          else if x > y then balance color a y (ins b)
          else s

['d','a','s','f']   s
                   /\
                  a  f
                 /
                d        (unsorted tree)

1 Ответ

1 голос
/ 05 июня 2011

вы можете использовать мою реализацию RBTree в haskellDB, http://hackage.haskell.org/package/RBTree

с помощью функции insert:

insert :: (a -> a -> Ordering) -> RBTree a -> a -> RBTree a

передать ей (\_ _ -> LT) функцию, тогда вы всегда можете поместить новый элемент в крайнее левое место.

...