【问题标题】:Build Binary Tree from Preorder Traversal: Stack Overflow Error从前序遍历构建二叉树:堆栈溢出错误
【发布时间】:2014-12-07 01:10:18
【问题描述】:

我有一棵树,叶子用 L 标记,非叶子节点用 I 标记。我得到了树的前序遍历。一个例子是 IIILLILILLLIIILLLIILILLL。我必须为这个包含的字符串构建霍夫曼树。我最初为我的参数传入了一个新的 Root()、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 异常被抛出。我会认为我一开始的基本情况会返回并处理它。

【问题讨论】:

    标签: java recursion tree huffman-code preorder


    【解决方案1】:

    我相信这是问题所在:

    makeTree(root.getLeftChild(), start++, treeString);
    

    我不确定你的方法是什么,但看起来如果你看到I,你的计划是转到左侧节点,并从下一个字符开始检查字符串。

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

    但是,将其更改为 ++start 将无法正常工作。(它可能会避免堆栈溢出,但它不会正常工作。)原因是当您调用 @987654329 @,你想给它你希望递归调用开始查找的字符串的起始位置——但你还希望递归调用告诉它它消耗了多少字符串。这是必要的,因为在makeTreegetLeftChild 上递归调用自己之后,您将在getRightChild 上再次调用它,并且您需要以正确的起点调用它。

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

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

    【讨论】:

    • 不得不完全重新做我的树,但它最终工作了。谢谢。我不记得 post 和 pre-increment 运算符之间的区别
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-05-10
      • 2012-02-17
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 2011-07-09
      • 1970-01-01
      • 2012-11-09
      相关资源
      最近更新 更多