Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 后序遍历_Java_Recursion_Binary Search Tree - Fatal编程技术网

Java 后序遍历

Java 后序遍历,java,recursion,binary-search-tree,Java,Recursion,Binary Search Tree,我试图在后序遍历之后返回我的树的字符串表示,但它给了我工作。似乎是一个足够简单的代码,但我似乎无法得到它。调试也没有多大帮助。我不知道我应该看什么。这里出了什么问题? 我知道在这个意义上使用字符串是不好的做法,但我只是把一些东西拼凑起来。我本可以使用字符串缓冲区或其他东西,但现在我不明白为什么这不起作用,并想找出原因 public String postOrderTraversal(){ String answer = ""; return postOrder

我试图在后序遍历之后返回我的树的字符串表示,但它给了我工作。似乎是一个足够简单的代码,但我似乎无法得到它。调试也没有多大帮助。我不知道我应该看什么。这里出了什么问题? 我知道在这个意义上使用字符串是不好的做法,但我只是把一些东西拼凑起来。我本可以使用字符串缓冲区或其他东西,但现在我不明白为什么这不起作用,并想找出原因

  public String postOrderTraversal(){
        String answer = "";
        return postOrderTraversal(root, answer);
    }

    private String postOrderTraversal(Node aux, String answer){
        if(aux == null){
            return "";
        }
        else{
            postOrderTraversal(aux.left, answer);
            postOrderTraversal(aux.right, answer);
            answer += aux.data;
        }

        return answer;

    }

您没有添加子树的后序遍历。您可以将其更正为

private String postOrderTraversal(Node aux) {
    if(aux == null) return "";
    return postOrderTraversal(aux.left) + postOrderTraversal(aux.right) + aux.data;
}

字符串是不可变的对象。仅仅传递引用不会更新返回值。你应该试试StringBuilder

public String postOrderTraversal(){
    StringBuilder answer  = new StringBuilder();
    postOrderTraversal(root, answer);
    return answer.toString();
}

private void postOrderTraversal(Node aux, StringBuilder answer){
    if(aux == null){
        return;
    }
    else{
        postOrderTraversal(aux.left, answer);
        postOrderTraversal(aux.right, answer);
        answer.append(aux.data);
    }
}

不幸的是,这不起作用。在我的测试中,它多次重复左撇子和根。它应该打印2,5,6,10,9,4,但打印了2,2,2,5,6,2,2,2,5,6,10,9,4。您可以尝试修改后的代码。实际上,您不需要将字符串
answer
传递给递归调用。是的。真管用!呵呵。因此,实际上不需要字符串值来跟踪所有内容。我首先尝试使用字符串缓冲区,并认为同样的方法也适用于字符串。显然不是。我知道如何使用字符串生成器。这更像是一个为什么它不起作用的问题,并试图理解它。谢谢你的意见!