【问题标题】:Reconstructing binary tree from inorder and preorder traversals从中序和前序遍历重构二叉树
【发布时间】:2023-10-21 06:31:01
【问题描述】:

我编写了以下代码,用于从其中序和前序遍历构造一棵树。它对我来说看起来是正确的,但它产生的最终树与构建它的树没有相同的顺序输出。谁能帮我找出这个函数的缺陷?

public btree makeTree(int[] preorder, int[] inorder,  int left,int right)
{
    if(left > right)
        return null;

    if(preIndex >= preorder.length)
        return null;

    btree tree = new btree(preorder[preIndex]);
    preIndex++;

    int i=0;
    for(i=left; i<= right;i++)
    {
        if(inorder[i]==tree.value)
            break;

    }


        tree.left = makeTree(preorder, inorder,left, i-1);
        tree.right = makeTree(preorder, inorder,i+1, right );

    return tree;

}

注意:preIndex 是在函数外声明的静态变量。

【问题讨论】:

  • Ehm.. 这到底有什么用? :)
  • 没什么。这是我试图回答的一个有趣的问题。我想这没什么坏处。
  • @Javaguru - academic 乍一看 - 但另一方面,可以通过存储中序和前序遍历的结果来序列化二叉树。
  • 哦,是的,这是真的。有用的见解。
  • @Sid,关于 SO 还有一个相关问题:Construct a tree - 来自 inorder 和 postorder 遍历。不同的输入,但可能很有趣......

标签: java binary-tree traversal inorder


【解决方案1】:
in = {1,3,2,5}; pre = {2,1,5,3};

我在“手工”构建树时遇到了一些困难。 pre 表示 2 必须是根,in 表示 {1,3} 是左子树的节点,{5} 是右子树:

      2
     / \
    /   \
  {1,3} {5}

但是知道这一点,3 不能是pre 中的最后一个元素,因为它显然是左子树的一个元素并且我们有一个右子树。这些树的有效前序遍历是{2,1,3,5}{2,3,1,5}。但是{2,1,5,3}是不可能的。

也许错误不在此方法中,而是在您创建中序和前序遍历的算法中。或者,您是否随机选择了 in[]pre[] 的值?

【讨论】:

  • 废话!我认为这是对的。我不敢相信我浪费了这么多时间,以为我一直都正确地误解了递归。谢谢。