根据this帖子,我尝试使用 Boost 库实现red-black tree
。 this页面中的示例使用两个不同的函数来在树中插入节点。功能如下:
//Now insert node "two" in the tree using the sorting functor
algo::insert_equal_upper_bound(&header, &two, node_ptr_compare());
//Now insert node "three" in the tree using the sorting functor
algo::insert_equal_lower_bound(&header, &three, node_ptr_compare());
我查看了here以获取更多信息,我发现insert_equal
也是如此:
template<typename NodePtrCompare>
static node_ptr
insert_equal(const node_ptr & header, const node_ptr & hint,
const node_ptr & new_node, NodePtrCompare comp);
以下是这三个功能的描述:
insert_equal_upper_bound:根据&#34; comp&#34;将new_node插入到上限之前的树中。
insert_equal_lower_bound:根据&#34; comp&#34;将new_node插入到下限之前的树中。
insert_equal:使用&#34; hint&#34;将new_node插入树中。作为它将被插入的提示。如果&#34;暗示&#34;是插入需要恒定时间的upper_bound(在最坏的情况下是两次比较)。
但我不明白这三个功能之间的区别。红黑树不是一棵(几乎)平衡的树吗?使用这些函数插入节点后它会保持平衡吗?我应该使用哪一个?
答案 0 :(得分:1)
是的,所有这些(模数错误)都会保持树的平衡。
然而,暂时忽略树形结构,并且更容易理解它们的作用。将它视为一个简单的线性集合,例如:
1 3 3 6 6 7 8 8 9
现在让我们假设您要在集合中插入另一个8
。如果您使用insert_equal_lower_bound
,它会在之前插入新的8
,而这些<{em>}已经在集合中。
如果您使用8
或insert_equal_upper_bound
,那么新的insert_equal
将在已经在集合中的最后一个8
后插入。这里的不同之处在于8
允许您指定关于您认为插入位置的“提示” - 如果该提示正确,则会为插入提供缓慢的常量复杂性(而不是您获得的对数复杂度)没有提示)。