如何获得二叉树(集合或映射)的根?

How can I get the root of a binary tree (set or map)?

如何获取 std::setstd::map 的根节点?它提供了获取 begin()end() 迭代器的函数,但我在文档中没有看到任何关于获取根的信息。

你不能那样做。这就是为您提供迭代器的原因——将您自己从实现细节中抽象出来。此外,我刚刚在 C++ 标准中对 "tree" 关键字执行了 Ctrl + F,发现只有 5 次 none 与 set/map 实现细节相关。

如果您需要二叉树的根 - 创建您自己的数据结构。

其中任何一个都没有根节点的概念Abstract Data Types (neither set nor map). The fact that they are implemented as a red–black tree只是一个实现细节。

支持的操作如下:

根据维基百科页面,关于 ADT 的好处之一是:

Encapsulation
Abstraction provides a promise that any implementation of the ADT has certain properties and abilities; knowing these is all that is required to make use of an ADT object. The user does not need any technical knowledge of how the implementation works to use the ADT. In this way, the implementation may be complex but will be encapsulated in a simple interface when it is actually used.

看来您试图打破这种封装,试图对实现了解太多。

我也在看这个功能。看起来我们无法直接获取 stl 映射或集合的根值,除非我们遍历 map/set.

Ex:从地图的总大小中,获取根索引(即 size/2),然后迭代直到覆盖地图中的所有元素。这种方法可行,因为 stl 映射在内部是一棵平衡树。

为什么我需要这个?

一道题,我想求中位数。最简单的出路是 return 根(或根及其右边的平均值 child)。

我也有自己的二叉树实现,可以在这里使用。但是对于这个问题,我希望树是平衡的。

我有以下选择 -

  1. 使用 stl 贴图。这是一个平衡的DS。但是,没有简单的方法可以通过索引号获取根或元素。例如:我无法获取索引 4 处的元素。 所以,我正在考虑遍历地图直到找到根。 很好,又快又容易 - 但计算中位数需要 O(n/2).

  2. 实现一棵平衡树,并向return根值添加一个函数。更多工作要做。但是,我可以在 O(1) 时间内检索中位数。

如果你能想到更好的方法,请告诉我。