我正在开发一个applet,它会在添加和删除值时显示堆。我正在实现堆作为整数树 - IntTrees。我正在编写倾斜堆的代码,而'添加'方法给了我一些麻烦。 add方法通常有效,但偶尔会在添加值时导致堆栈溢出错误,而我似乎无法弄清楚原因。
这是我为add方法编写的代码
't'是一个实例变量 - 堆本身。
// adds value to heap
public void add(int value) {
IntTree smallTree = new IntTree(value, empty(), empty());
if (t == null) {
t = smallTree;
} else {
t = merge(t, smallTree);
}
}
public IntTree merge(IntTree left, IntTree right) {
if (isEmpty(left)) return right;
if (isEmpty(right)) return left;
int leftVal = left.value();
int rightVal = right.value();
IntTree result;
if (rightVal <= leftVal) {
result = merge(right,left);
} else {
result = left;
if (result.isEmpty(left)) {
result.setLeft(right);
} else {
IntTree temp = result.right();
result.setRight(result.left());
result.setLeft(merge(temp,right));
}
}
return result;
}
此代码中是否存在导致堆栈溢出错误的问题,或者问题可能是程序中的其他地方?谢谢!
答案 0 :(得分:2)
看一下这个片段
if (rightVal <= leftVal) {
result = merge(right,left);
rightVal == leftVal
时会发生什么?
答案 1 :(得分:2)
@Adam找到了你的问题。这是为了帮助您自己找到这样的问题。
当您收到意外错误或异常时,请务必仔细研究堆栈跟踪。堆栈跟踪中经常有很多信息 ...如果您知道如何阅读它。
在这种情况下,您会看到merge
方法有很多很多堆栈帧。如果您仔细查看过它们,您会注意到merge
一遍又一遍地从同一行代码中调用merge
。这是递归循环的经典标志。
鉴于这些线索(特别是递归发生的行号),弄清楚为什么会有递归循环是一件简单的事情。