【问题标题】:Height of Binary Tree StackOverflow Exception二叉树堆栈溢出异常的高度
【发布时间】:2015-12-11 19:46:00
【问题描述】:

我正在尝试在 Java 中查找二叉搜索树的高度。这是我的getHeight() 函数。

public int getHeight(RedBlackTree<E> n) {
    if (n == EMPTY || n == null) // line 427
        return -1;
    return 1 + Math.max(getHeight(n.left), getHeight(n.right)); // line 429
}

我不断收到 StackOverflow 异常:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at RedBlackTree.getHeight(RedBlackTree.java:427)
    at RedBlackTree.getHeight(RedBlackTree.java:429)
    at RedBlackTree.getHeight(RedBlackTree.java:429)
    at RedBlackTree.getHeight(RedBlackTree.java:429)
    at RedBlackTree.getHeight(RedBlackTree.java:429)
    ...
    ...
    ...

注意:我的树很大,所以也许这就是原因?

谁能帮帮我?谢谢!

【问题讨论】:

  • 你的树有多高?请注意,如果它构造不好并且包含循环,那肯定会导致问题。
  • 我不确定。我会知道该功能是否有效哈哈。
  • 那么树是如何构建的?您是否有测试用例来查看它们是否有效? (如果没有,现在是开始测试的好时机......)
  • 如果这应该是一棵红黑树,这肯定表明你的树平衡或构造不正确。一个正确平衡的红黑树,大到足以像这样溢出堆栈,它必须大得难以想象,而且在你用完堆栈之前你就会用完内存。
  • @LouisWasserman 这是一棵红黑树。

标签: java tree binary-tree binary-search-tree red-black-tree


【解决方案1】:

当然,当您的树非常高时,可能会发生这种情况:每次调用 getHeight 都会创建一个堆栈框架,因此您冒着耗尽非常高的树的堆栈的风险。

如果您的图表有一个循环,这也可能发生,这意味着它实际上不是一棵树。您可以通过将到目前为止您访问的树的所有顶点存储在HashSet 中来测试是否是这种情况。如果你在计算树高的过程中第二次看到一个顶点,你就会得到一个带循环的图。

解决堆栈溢出问题的一种方法是使用您自己的集合、堆栈或队列,以迭代方式计算高度。

【讨论】:

    【解决方案2】:

    我回答这个频道是因为评论已经有点长了。

    堆栈溢出似乎很奇怪,因为您使用的是红黑树,因为它的高度限制为 2 log(n + 1)(二进制 log)

    作为一个具体的例子,一亿个键的树的最大高度是

    2*log(1e8 + 1)/log(2) ~ 54 rounded to ceil.
    

    54 个堆栈帧并不算多,除非您使用受限硬件、虚拟机等和/或您的例程接收许多参数并使用许多局部变量。

    所以,我要做的第一件事是检查你的例程是否有效接收或产生正确的红黑树

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 2014-12-07
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 2014-12-29
      • 2012-05-10
      相关资源
      最近更新 更多