繁体   English   中英

二叉树StackOverflow异常的高度

[英]Height of Binary Tree StackOverflow Exception

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

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

有人可以帮我吗? 谢谢!

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

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

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

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

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

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

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

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

因此,我要做的第一件事是检查您的例程实际上是否接收或产生正确的红黑树

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM