StackOverflowError - 向堆添加值

时间:2010-11-03 02:08:29

标签: java algorithm heap

我正在开发一个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;
  } 

此代码中是否存在导致堆栈溢出错误的问题,或者问题可能是程序中的其他地方?谢谢!

2 个答案:

答案 0 :(得分:2)

看一下这个片段

if (rightVal <= leftVal) {
  result = merge(right,left);

rightVal == leftVal时会发生什么?

答案 1 :(得分:2)

@Adam找到了你的问题。这是为了帮助您自己找到这样的问题。

当您收到意外错误或异常时,请务必仔细研究堆栈跟踪。堆栈跟踪中经常有很多信息 ...如果您知道如何阅读它。

在这种情况下,您会看到merge方法有很多很多堆栈帧。如果您仔细查看过它们,您会注意到merge一遍又一遍地从同一行代码中调用merge。这是递归循环的经典标志。

鉴于这些线索(特别是递归发生的行号),弄清楚为什么会有递归循环是一件简单的事情。