我正在使用std::set
类来解决leetcode问题。通过Googling,我了解到std::set
使元素保持有序排列,并且听说set.begin()
返回最小的元素。但是我也听说集合使用红黑树,并且具有O(log n)时间复杂度。我不明白这两个元素如何结合在一起,就像当红黑树不能保证最小元素将是head时,set.begin()
如何返回最小元素。
此外,set.begin()
函数使该容器似乎使用数组而不是链接列表来构建红黑树,这也是我不理解的。如何使用数组代替树?
答案 0 :(得分:2)
在基础树中,最左边的节点是最小的节点,begin()
是最左边的节点。
迭代以适当的顺序遍历树的节点。
例如,如果树是(这是一个更简单的“常规”二进制搜索树,但原理与红黑树相同)
4
/ \
2 6
/\ /
1 3 5
然后迭代将从1开始,然后向上移动到2,再向下移动到3,向上两步到4,向下两步到5,最后到6。
(这意味着遍历树的“步骤”不是固定时间的操作。)
答案 1 :(得分:0)
该标准未对任何容器强加特定的实现。红黑树是set
的可能实现。还可以自由选择如何使begin
保持不变的复杂性。
假设实现选择一棵树,最明显的方法是保持指向最小元素以及树根的指针。
您可以使用数组实现有序集,例如boost::flat_set
。这不能满足与std::set
相同的复杂性要求。它仅通过插入已排序的位置,并且仅当不存在等效元素时才能做到这一点。