【问题标题】:Flattened array representation for a Binary Tree data structure二叉树数据结构的扁平数组表示
【发布时间】:2021-04-04 11:53:23
【问题描述】:

我碰巧遇到了二叉树数据结构的扁平数组表示,其中树上的所有值都存储在与索引树对应的数组中。

我想知道如何在没有叶节点的数组索引处存储空值。我假设引用是在 Java 中的。在 C++ 中,我们如何获得一个不等于 0 的空值。我们应该使用指针数组来代替吗?一种允许指针指向节点值(如果存在)或假定为nullptr(当节点值为空时)的一种。

我不打算使用 C++ 中的 NULL 值,因为它等于 0 整数,这在整数数组的情况下会导致冲突。

如果您需要澄清,请告诉我。

【问题讨论】:

  • 你可以通过要求最后一层从左到右填充来规避这个问题,在这种情况下你只需要知道数组的填充前缀有多长(=树的大小)。
  • 您可以存储指向动态分配对象的指针。如果你想避免动态分配,你可以存储std::optional<T>,它在内部保存T
  • Norrius 所指的属性意味着它通常被称为“二叉堆”,并且确保存储节点以保证这种约束的过程有时被称为“堆”数组。见:en.wikipedia.org/wiki/Binary_heap
  • 评论:为什么这个 Q 被否决了?我觉得没那么糟糕。尽管尝试过的代码示例可能会有所帮助。
  • 如果您的数组包含int 的元素,则没有其他方法可以假设某个int 值无效(并分别处理它)。如果0 不是一个合理的候选者,您可以使用-1 或其他任何您认为不是节点有效值的东西。如果所有 int 值都可能有效,那么您必须存储与您的值配对的其他内容,例如bool。这类似于@Evg 已经建议的std::optional<T>

标签: c++ arrays null binary-tree


【解决方案1】:

使用 -1。

不,说真的。

甚至至少有一个平台的 C 或 C++ nullptr 为 -1。它确实需要仔细的 cast-to-bool(好吧,cast-to/from-integral;在标准下,0 必须转换为 nullptr,但 null ptr 的位模式不必全为 0)代码。

【讨论】:

  • 甚至有些平台的 C++ nullptr 为 -1。 你能说出一个吗?
  • @evg 不,我不能;但是,如果我 decall,它是一个 gpu,其中 0 是有效地址,而 -1 不是。可能是 C 而不是 C++。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多