Java 具有二叉树的StackOverflowerr

Java 具有二叉树的StackOverflowerr,java,binary-tree,stack-overflow,Java,Binary Tree,Stack Overflow,对左子级使用以下插入方法-右同级树-似乎在该方法的私有版本中再次调用addpage的行处导致StackOverflower错误。有人能帮我建议如何修复吗?对不起,如果以前有人问过这个问题 public PageNode addPage(String PageName) { PageNode ParentNode=new PageNode(); ParentNode.page=currentPage.page; if (this.homePage==null)

对左子级使用以下插入方法-右同级树-似乎在该方法的私有版本中再次调用addpage的行处导致StackOverflower错误。有人能帮我建议如何修复吗?对不起,如果以前有人问过这个问题

public PageNode addPage(String PageName)
{
    PageNode ParentNode=new PageNode();
    ParentNode.page=currentPage.page;
    if (this.homePage==null)
        this.homePage=ParentNode.parent;
    else
        ParentNode=this.addPage(PageName,ParentNode.parent);
    return ParentNode;
}
private PageNode addPage(String PageName, PageNode ParentNode)
{
            ParentNode = new PageNode();
            ParentNode.page=new Page(PageName);

    if (this.currentPage.page.compareTo(ParentNode.page)==0)
    {
        System.out.println("attempt to insert a duplicate");
    }
    else
                    if (ParentNode.page.compareTo(currentPage.page)<0)

                        if(currentPage.firstchild == null)
            currentPage.firstchild=ParentNode;
                        else
                            ParentNode = addPage(PageName, ParentNode.firstchild);
                        else if(currentPage.nextsibling == null)
                                currentPage.nextsibling=ParentNode;
                        else
                                ParentNode = addPage(PageName, ParentNode.nextsibling);
            return ParentNode;
}

您正在尝试实现一个二进制搜索树。您应该保证插入/删除/查找操作在搜索树中花费很长时间。addPage方法不会重新平衡树,因此在最坏的情况下,树的高度处于启用状态。看看你是否不熟悉这个符号。了解红黑/AVL树

您正在使用递归添加新节点。由于树的高度可以与上一样大,因此超出了堆栈大小的限制


我不知道JVM中每个线程的堆栈大小的默认上限。

重写方法以迭代而不是递归


Java不实现尾部递归删除。

考虑修复代码格式;另外,如果没有{}的if/else会导致微妙的难以发现的bug,特别是当这样嵌套时。如果代码很难阅读,我就不再看问题。因此,查看导致堆栈溢出的原因的最简单方法是查看每个调用传递了什么,以及它如何适合调用堆栈。使用调试器或那些原始println。这应该是什么语言?考虑适当的标记。一个好的二叉树搜索将按照你的建议去做,但是仅仅是一个功能性的搜索是不必要的。参见Knuth,了解最终的讨论和示例算法。@ddyer固定了措辞,以避免混淆。谢谢