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

时间:2017-09-01 04:55:28

标签: c++ dictionary tree binary-tree std

如何获取std::mapbegin()的根节点?它提供了获取end()per迭代器的函数,但我没有在文档中看到有关获取根的任何内容。

3 个答案:

答案 0 :(得分:2)

你做不到。这就是为您提供迭代器的原因 - 从实现细节中抽象出自己。而且,我刚刚在"树"上完成了Ctrl + F. C ++ Standard中的关键字,只发现了5次,其中没有一个与set / map实现细节有关。

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

答案 1 :(得分:1)

任何Abstract Data Types中都没有根节点的概念(setmap都没有。它们作为red–black tree实现的事实只是一个实现细节。

以下是支持的操作:

在维基百科页面上,ADT的一个好处是:

  

<强>封装
  抽象提供了ADT的任何实现具有某些属性和能力的承诺;知道这些是使用ADT对象所需的全部内容。用户不需要任何关于实现如何使用ADT的技术知识。通过这种方式,实现可能很复杂,但在实际使用时将封装在简单的界面中。

似乎你试图破解那种试图过多了解实现的封装。

答案 2 :(得分:1)

我也在看这个功能。除非我们反复遍历地图/集合,否则我们似乎无法直接获取stl地图或集合的根值。

Ex:从地图的总大小中,获取根索引(即size / 2),然后进行迭代,直到覆盖了地图中的那么多元素为止。由于stl映射在内部是平衡树,因此该方法将起作用。

我为什么需要这个?

对于一个问题,我想获得中位数。最简单的方法是返回根(或根及其右子项的平均值)。

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

我有以下选择-

  1. 使用stl映射。这是一个平衡的DS。但是,没有简单的方法可以通过索引号获取根或元素。例如:我无法在索引4处获得该元素。 因此,我一直在考虑遍历地图直到找到根。 很好,快速,轻松-但是计算中位数将花费O(n / 2)。

  2. 实现一棵平衡树并添加一个函数以返回根值。还有更多工作要做。但是,我可以获取O(1)时间的中位数。

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