Как сделать древовидную структуру с кортежами в Erlang

Я явно новичок в Erlang. Я хочу сделать красно-черное дерево с кортежами, которое имеет {Key, Value, Color, Left, Right}. Когда я добавляю первый элемент в мое дерево, оно выглядит так: {2,"что-то", b, nil, nil}, потому что у него еще нет дочерних элементов. Моя проблема в том, что, если я хочу добавить следующий элемент, как левый или правый дочерний элемент этого дерева, я не могу добавить его.

2 ответа

Предположим, у нас есть:

T = {2, "something", b, nil, nil}.

Чтобы вставить что-то в левую ветку, мы можем сделать что-то вроде:

insert_left(X, {Key, Value, Color, Left, Right}) ->
    {Key, Value, Color, insert_left(X, Left), Right};
insert_left(X, nil) -> X.

Или, возможно, немного более нечитаемым:

insert_left(X, {K, V, C, L, R} = T) ->
   V = insert_left(X, L),
   setelement(4, T, V).

Теперь мы можем вставить что-то:

insert_left(5, T).

Правильное внедрение RB будет осуществлять insert рассматривая поддерево на основе ключа. Это также обернет оставшееся дерево в balance функция для поддержания RB-инварианта. Ожидается, что всего будет около 12 строк кода (плюс / минус 10).

Ну, вы можете взглянуть на stdlib gb_trees модуль ( к документации), так как большинство структур данных Erlang/OTP представляют собой просто комбинацию кортежей, атомов, списков и чисел.

Другие вопросы по тегам