2015-11-04 39 views
0

我试图在发布命令遍历后返回我的树的字符串表示形式,但它给了我作品。看起来像一个足够简单的代码,但我似乎无法得到它。调试也不是很有帮助。我失去了我应该看的东西。这里出了什么问题? 我知道在这个意义上使用字符串是不好的做法,但我只是把东西扔在一起。我可以使用字符串缓冲区或其他的东西,但现在我很难理解为什么这不起作用,并想弄清楚原因。PostOrder Traversal Java

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; 

    } 

回答

0

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

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

不幸的是,这并没有奏效。在我的测试中,它多次重复了左侧的孩子和根。它应该已经打印2,5,6,10,9,4但是打印2,2,2,2,5,6,2,2,2,5,6,10,9,4 –

+0

您可以尝试修改码。实际上,您不需要将字符串“answer”传递给递归调用。 – 0605002

+0

是的。这样可行!呵呵。所以你实际上并不需要一个字符串值来跟踪它。我先用字符串缓冲区试了一下,并认为也许相同的方法也适用于字符串。显然不是。 –

0

字符串是不可变的对象。只是传递引用不会更新返回值。你应该尝试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); 
    } 
} 
+0

我知道如何用字符串生成器来完成它。这更多的是为什么它不能解决问题并试图理解它。感谢您的输入! –