Java 从前序遍历生成二叉树:堆栈溢出错误

Java 从前序遍历生成二叉树:堆栈溢出错误,java,recursion,tree,huffman-code,preorder,Java,Recursion,Tree,Huffman Code,Preorder,我有一棵树,其中叶子用L标记,非叶子节点用I标记。我得到了树的前序遍历。一个例子是Iillillillillill。我必须为这个包含的字符串构建哈夫曼树。我最初传入了一个新的根0,并为参数传递了我的treeString。TreeString将是上面粘贴了I和L的字符串。由于某种原因,我的代码导致抛出StackOverflow异常。对于makeTree方法,我的代码如下所示: public static void makeTree (BinaryNodeInterface<Character

我有一棵树,其中叶子用L标记,非叶子节点用I标记。我得到了树的前序遍历。一个例子是Iillillillillill。我必须为这个包含的字符串构建哈夫曼树。我最初传入了一个新的根0,并为参数传递了我的treeString。TreeString将是上面粘贴了I和L的字符串。由于某种原因,我的代码导致抛出StackOverflow异常。对于makeTree方法,我的代码如下所示:

public static void makeTree (BinaryNodeInterface<Character> root, int start, String treeString)
{
    if (treeString.charAt(start)=='L'){

        root.setLeftChild(null);
        root.setRightChild(null);
        return;
    }
    BinaryNodeInterface<Character> leftSide = new BinaryNode<Character>();
    root.setLeftChild(leftSide);
    makeTree(root.getLeftChild(), start++, treeString);
    BinaryNodeInterface<Character> rightSide = new BinaryNode<Character>();
    root.setRightChild(rightSide);
    makeTree(root.getRightChild(), start++, treeString);
}

我不知道是什么导致抛出stackoverflow异常。我会认为我最初的基本情况会回来处理它。

我相信这就是问题所在:

makeTree(root.getLeftChild(), start++, treeString);
我不确定你的方法是什么,但如果你看到一个I,你的计划是转到左边的节点,从下一个字符开始检查字符串

无限递归的原因是start++是一个后增量运算符,这意味着它给您start的当前值,然后递增它。因此,每次makeTree调用自己时,它都使用相同版本的start调用自己,从而查看输入字符串中的相同I

但是,将其更改为++开始将无法使事情正常进行。它可能会避免堆栈溢出,但不会正常工作。原因是,当您调用makeTree时,您希望给它一个字符串的起始位置,您希望递归调用开始查找该位置,但您也希望递归调用告诉它它消耗了多少字符串。这是必要的,因为在makeTree在getLeftChild上递归调用自身之后,您将在getRightChild上再次调用它,并且需要使用正确的起点调用它

请注意,每个递归调用都有自己的start副本。因此,当makeTree调用自身,并且第二个makeTree递增start时,这对第一个makeTree看到的start没有影响


您将需要每个递归makeTree告诉其调用者它消耗了多少字符串。最简单的方法可能是将返回类型更改为int;您可以决定是否希望函数结果是所使用的字符数,或者它停止扫描的索引,或者类似的内容。然后,在递归调用makeTree之后,使用函数result来调整start参数。确保makeTree在叶子和非叶子情况下都返回正确的结果。小心避免一个接一个的错误。

不能仅从预订单列表创建树。
至少您还需要进行有序遍历,或者如果是完整的树,那么您也可以使用posrorder。

必须完全重新生成我的树,但它最终还是工作了。谢谢你。我不记得增量后运算符和增量前运算符之间的区别