gb_trees:balance/1
对树进行平衡操作
用法:
balance(Tree1) -> Tree2
内部实现:
-spec balance(Tree1) -> Tree2 when
Tree1 :: gb_tree(),
Tree2 :: gb_tree().
balance({S, T}) ->
{S, balance(T, S)}.
balance(T, S) ->
balance_list(to_list_1(T), S).
balance_list(L, S) ->
{T, []} = balance_list_1(L, S),
T.
balance_list_1(L, S) when S > 1 ->
Sm = S - 1,
S2 = Sm div 2,
S1 = Sm - S2,
{T1, [{K, V} | L1]} = balance_list_1(L, S1),
{T2, L2} = balance_list_1(L1, S2),
T = {K, V, T1, T2},
{T, L2};
balance_list_1([{Key, Val} | L], 1) ->
{{Key, Val, nil, nil}, L};
balance_list_1(L, 0) ->
{nil, L}.
对树 Tree1 进行重新平衡操作。这是一个很少需要用到的函数,但是当大量节点从树中被删除而之后没有往树里添加新数据时,那么调用这个函数是很有必要的。重新平衡的操作可以减少查找数据时的查询次数,因为删除操作不会对树进行重新平衡。
Tree1 = gb_trees:empty(), Tree2 = gb_trees:enter(a, 1, Tree1), gb_trees:balance(Tree2).