我正在构建一个堆数据结构,但令我发疯的部分是检查是否有空子值。

我正在使用Vector,并且正在将父母与孩子进行比较,但是如果只有一个孩子,则程序会崩溃,因为类似

vectorObject.get(i) //i'th element doesn't exist


将返回一个异常。

我不能用类似的东西检查空元素

if (vectorObject.get(i) == null)


由于运行get()方法将自动中断程序,因此,如何在没有某些无法理解的怪异破解的情况下实际检查不存在的元素?

最佳答案

您似乎很困惑。我认为您需要重新阅读用于设计堆数据结构的任何引用(或阅读the relevant section of the Wikipedia article)。

如果您的父母在0,则您的孩子在2*(0)+1=12*(0)+2=2。在这种情况下,1 < vectorObject.size()为true,但2 < vectorObject.size()为false,这意味着有一个左孩子,但没有右孩子。

由于Vector(如果您按照我的建议进行了切换,则为ArrayList)是从零开始的,因此您需要检查i < vectorObject.size(),而不是i <= vectorObject.size()。如果i < vectorObject.size(),则i是合法索引。

更新:

您可以通过两种方法来构造逻辑。如果您必须完全不同于两个孩子的情况来处理单个孩子的情况,那么这可能是最好的方法:

int size = vectorObject.size();
if (2*i+2 < size) { /* Two-child case */ }
else if (2*i+1 < size) { /* One-child case */ }
else { /* No children case */ }


如果分别处理两个节点,则嵌套可能会更好:

int size = vectorObject.size();
if (2*i+1 < size) {
  // Handle left child
  if (2*i+2 < size) {
    // Handle right child
  }
  else {
    // No right child
  }
}
else { /* No children */ }

07-24 09:32