Как сделать древовидную структуру с кортежами в 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 представляют собой просто комбинацию кортежей, атомов, списков и чисел.