在Java中,从索引和预排序数据构建二叉树

在Java中,从索引和预排序数据构建二叉树,java,Java,我已经看过这个程序好几次了,但我真的看不出问题所在。基本上,它应该从以整数数组形式发送的按序和按序遍历数据重建二叉树,这是一个整数的二叉树 这是我正在使用的树: 234 / \ 98 678 / \ \ 45 124 1789 前订单是234、98、45、124、678、1789 顺序是45981242346781789 出现的问题是1789年。代码重建了直到1789年的树,出于某种奇怪的原因将其删除。我决定在顺序数组中切换678和1789,这

我已经看过这个程序好几次了,但我真的看不出问题所在。基本上,它应该从以整数数组形式发送的按序和按序遍历数据重建二叉树,这是一个整数的二叉树

这是我正在使用的树:

     234
    /   \
  98    678
 / \      \
45 124    1789
前订单是234、98、45、124、678、1789 顺序是45981242346781789

出现的问题是1789年。代码重建了直到1789年的树,出于某种奇怪的原因将其删除。我决定在顺序数组中切换678和1789,这使得1789在678的左边,0在678的右边。在下面的代码中,数组的顺序与我假设的相同

生成树代码:

public class BuildTree
{

public static BinaryTreeNode buildTree(int inOrder[], int preOrder[], int preIndex )
{               
    if (inOrder.length > 1)  
    {
        int inIndex = 0;
        for (int i = 0; i < inOrder.length; i++)
        {
            if (preOrder[preIndex] == inOrder[i])
            {
                inIndex = i ;
                break;                  
            }
        }

        if (inIndex > 0)
        {          
            BinaryTreeNode node = new BinaryTreeNode(inOrder[inIndex]);

            if (preIndex < preOrder.length - 1 )
            {
            node.setLeft(buildTree(leftArray(inOrder, inIndex), preOrder, preIndex + 1));
            node.setRight(buildTree(rightArray(inOrder, inIndex), preOrder, inIndex + 1));  
            }

            return node;
        }           
    }       
    return new BinaryTreeNode(inOrder[0]);
}


public static int[] leftArray(int[] input, int index)
{        
    int left[] = new int [index];

    for (int i = 0 ; i < index ; i ++)
    {
        left[i] = input[i] ;
    }

    return left;        
}


public static int[] rightArray(int[] input, int index)
{               
    int right[] = new int [index];
    int x= 0;

    for (int i = index +1  ; i < input.length  ; i ++)
    {
        right[x] = input[i] ;
        ++x;
    }

    return right;       
}
} //end class
主要测试方法:

public static void main(String[] args)
{
    int[] preOrder = {234, 98, 45,  124, 678, 1789};
    int[] inOrder =  {45,  98, 124, 234, 678, 1789};

    BinaryTreeNode bsTree = BuildTree.buildTree(inOrder, preOrder, 0);

    System.out.println(bsTree.getData());
    System.out.println(bsTree.getLeft().getData());
    System.out.println(bsTree.getLeft().getLeft().getData());
    System.out.println(bsTree.getLeft().getRight().getData());
    System.out.println(bsTree.getRight().getData());
    System.out.println(bsTree.getRight().getRight().getData());
    System.out.println(bsTree.getRight().getLeft().getData());

}

至少存在以下问题:

如果inIndex可以等于零,则可以在inOrder列表的第一个位置找到元素。 返回新的BinaryTreeNodeinOrder[0];仅当索引顺序列表中有元素时才应返回。当树不完整时,如果缺少叶节点,则应返回null; 在rightArray中,您需要分配input.length-index-1元素,而不仅仅是index。
除上述问题外,至少在您提供的测试中,逻辑正在运行。

类似:对于建议1,我尝试将第二个if语句更改为ifinIndex>=0,但这只会导致通过rightArray line right[x]=input[I]引发数组越界异常;建议2,我将return语句放在主if语句中,并在原来的位置返回null。似乎有效。建议3,我不确定你的意思,或者至少不知道如何实施。谢谢你的回复@德利亚多1号。您需要考虑到,在调用buildTree函数时,InIndex可以为零。3.我建议为剩余的右元素分配的空间应该是length-index-1,而不仅仅是index,您分配的空间要多得多。不管怎样,这些都是我对你最初提交的内容所做的修改。哇,我真不敢相信我错过了。谢谢你的快速回复。让别人看东西总是有帮助的!
public static void main(String[] args)
{
    int[] preOrder = {234, 98, 45,  124, 678, 1789};
    int[] inOrder =  {45,  98, 124, 234, 678, 1789};

    BinaryTreeNode bsTree = BuildTree.buildTree(inOrder, preOrder, 0);

    System.out.println(bsTree.getData());
    System.out.println(bsTree.getLeft().getData());
    System.out.println(bsTree.getLeft().getLeft().getData());
    System.out.println(bsTree.getLeft().getRight().getData());
    System.out.println(bsTree.getRight().getData());
    System.out.println(bsTree.getRight().getRight().getData());
    System.out.println(bsTree.getRight().getLeft().getData());

}