我正在构建一个堆数据结构,但让我发疯的部分是检查空子值。
我正在使用向量,并且正在将父母与孩子进行比较,但是如果只有一个孩子,则程序会崩溃,因为类似
vectorObject.get(i) //i'th element doesn't exist
将返回异常。
我不能用类似的东西检查空元素
if (vectorObject.get(i) == null)
因为运行 get() 方法会自动中断程序,所以你如何在没有一些不可读的奇怪黑客攻击的情况下实际检查不存在的元素?
你似乎很困惑。我认为您需要重新阅读用于设计堆数据结构的任何参考资料(或阅读维基百科文章的相关部分)。
如果你的父母在,0
那么你的孩子在2*(0)+1=1
和2*(0)+2=2
。在这种情况下,1 < vectorObject.size()
将为真但2 < vectorObject.size()
为假,表示有左孩子但没有右孩子。
由于Vector
(或者ArrayList
如果您已按照我的建议切换)是从零开始的,您需要检查 if i < vectorObject.size()
, not i <= vectorObject.size()
。如果i < vectorObject.size()
theni
是合法索引。
更新:
有两种方法可以在这里构建逻辑。如果您必须以与二孩情况完全不同的方式处理独生子女案件,那么这可能效果最好:
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 */ }
尝试/捕捉:
try{
yourVector.get(int theElementYouWant);
}
catch(NullPointerException){
//well, I guess that element was null!
}