Tree 如何在Erlang中生成元组树结构

Tree 如何在Erlang中生成元组树结构,tree,erlang,red-black-tree,Tree,Erlang,Red Black Tree,我显然是新来的二郎。我想制作一个带有元组的红黑树,它有{Key,Value,Color,Left,Right}。当我将第一项添加到树中时,它看起来是这样的:{2,“something”,b,nil,nil},因为它还没有任何子项。我的问题是,如果我想添加下一项,作为此树的左或右子项,我无法添加它。假设我们有: T = {2, "something", b, nil, nil}. 要在左分支中插入内容,我们可以执行以下操作: insert_left(X, {Key, Value, Color,

我显然是新来的二郎。我想制作一个带有元组的红黑树,它有{Key,Value,Color,Left,Right}。当我将第一项添加到树中时,它看起来是这样的:{2,“something”,b,nil,nil},因为它还没有任何子项。我的问题是,如果我想添加下一项,作为此树的左或右子项,我无法添加它。

假设我们有:

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_树
模块() 因为大多数Erlang/OTP数据结构只是元组、原子、列表和数字的组合