二叉树StackOverflow异常的高度

时间:2015-12-11 19:46:00

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

我试图在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)
    ...
    ...
    ...

注意:我的树很大,所以也许这就是为什么?

有人可以帮帮我吗?谢谢!

2 个答案:

答案 0 :(得分:1)

当然,当你的树很高时,可能会发生这种情况:getHeight的每次调用都会产生一个堆栈框架,所以你冒着为高大的树木耗尽堆栈的风险。

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

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

答案 1 :(得分:0)

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

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

作为具体案例,树的最大高度为1亿个键

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

54个堆栈帧不是太多,除非您使用受限制的硬件,vm等和/或您的例程接收许多参数并使用许多局部变量。

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