用Java中的后序遍历构造二叉搜索树

用Java中的后序遍历构造二叉搜索树,java,algorithm,tree,binary-search-tree,postorder,Java,Algorithm,Tree,Binary Search Tree,Postorder,我正在实现从给定的后序遍历数组构建BST(二进制搜索树)。我无法取回二进制搜索树。我得到了一些毫无意义的东西。这是我的密码 public class BinaryTreemethods { public static void main(String[] args) { int[] preOrder = { 5, 3, 1, 4, 8, 6, 9 }; int[] inOrder = { 1, 3, 4, 5, 6, 8, 9 };

我正在实现从给定的
后序遍历数组
构建
BST(二进制搜索树)
。我无法取回
二进制搜索树。我得到了一些毫无意义的东西。这是我的密码

public class BinaryTreemethods {
     public static void main(String[] args) {
             int[] preOrder = { 5, 3, 1, 4, 8, 6, 9 };
        int[] inOrder = { 1, 3, 4, 5, 6, 8, 9 };
        int[] postOrder = {1,4,3,8,6,9,5};

           static int postIndex=postOrder.length-1;
           Node postordertree= buildBinarytreefromPostOrder(postOrder, 0, postOrder.length-1);
           System.out.println("pre order traversal of node from postorder reconstructed tree ");
           printPreOrder(postordertree);

      }
      private static void printPreOrder(Node tree) {
        if (tree != null) {
            System.out.print(" " + tree.data);
            printPreOrder(tree.left);
            printPreOrder(tree.right);
        }

    }
      //this just reconstructs BT from post-order traversal elements
    public static Node buildBinarytreefromPostOrder(int[] post, int start, int end){
        if (postIndex<start || start > end ){
            return null;
        }

        Node root = new Node(post[postIndex]);
        postIndex--;
        if (end == start){
            //System.out.println("called");
            return root;
        }

        int i = 0;
        for (i=end;i>=start;i--){
            if (post[i]<root.data)
                break;
        }

        // Use the index of element found in postorder to divide postorder array
        // in two parts. Left subtree and right subtree
            root.right=buildBinarytreefromPostOrder(post,i+1, postIndex);
        root.left=buildBinarytreefromPostOrder(post,start,i);
             //root.left=buildBinarytreefromPostOrder(post,start,i);
        //root.right=buildBinarytreefromPostOrder(post,i+1, postIndex);

        return root;
    }
}
公共类二进制树方法{
公共静态void main(字符串[]args){
int[]前序={5,3,1,4,8,6,9};
int[]顺序={1,3,4,5,6,8,9};
int[]后序={1,4,3,8,6,9,5};
静态int postIndex=postOrder.length-1;
节点postordertree=buildBinarytreefromPostOrder(postOrder,0,postOrder.length-1);
System.out.println(“从后序重构树对节点进行前序遍历”);
printPreOrder(postordertree);
}
私有静态void printproorder(节点树){
如果(树!=null){
系统输出打印(“+树数据”);
printPreOrder(树左);
printPreOrder(树右);
}
}
//这只是从后序遍历元素重建BT
公共静态节点buildBinarytreefromPostOrder(int[]post,int start,int end){
如果(索引后结束){
返回null;
}
节点根=新节点(post[postIndex]);
后索引--;
如果(结束==开始){
//System.out.println(“被调用”);
返回根;
}
int i=0;
对于(i=end;i>=start;i--){

如果(post[i]作为每个子树的根,则取整个结构的全局
postIndex
。应取子数组的最后一个元素(
end

应该是这样

public static Node buildBinarytreefromPostOrder(int[] post, int start, int end)
{
    if (end < start)
        return null;

    Node root = new Node(post[end]);

    if (end == start)
        return root;

    int i;
    for (i = end; i >= start; i--)
        if (post[i] < root.data)
            break;

    root.left = buildBinarytreefromPostOrder(post, start, i);
    root.right = buildBinarytreefromPostOrder(post, i + 1, end - 1);

    return root;
}
publicstaticnode buildbinarytreecompostorder(int[]post,int start,int end)
{
如果(结束<开始)
返回null;
节点根=新节点(post[end]);
如果(结束==开始)
返回根;
int i;
对于(i=end;i>=start;i--)
if(post[i]
你试过了吗?你的意思是在递归调用中使用
end
而不是
postIndex
?嗯,我的意思是肯定有错误。我想你根本不需要
postIndex
(或者我不理解它的目的:)。我添加了一些编辑,不确定这是否能帮助你理解postIndex的原因