BST中的字符串toString方法(二叉搜索树)

时间:2015-08-26 10:27:38

标签: java data-structures binary-search-tree tostring

为什么下一个方法什么都不打印,但是当我将String更改为数组时,它可以正常工作?

不工作:

public String toString(){
    //In-Order - left,root,right.
    String s ="";
    toString(root,s);
    return s;
}
public void toString(BSTNode root,String s){
    if (root!=null){
        toString(root.left,s);
         s=s+","+ root.data;
         toString(root.right,s);
    }
}

工作:

public String toString(){
    //In-Order - left,root,right.
    String[] s =new String[1];
    s[0]="";
    toString(root,s);
    return s[0];
}
public void toString(BSTNode root,String[] s){
    if (root!=null){
        toString(root.left,s);
         s[0]=s[0]+","+ root.data;
         toString(root.right,s);
    }

2 个答案:

答案 0 :(得分:3)

原因是,String不是普通的Reference-Type。如果更改String,则会生成一个新String并返回修改后的String(String是不可变的)。 (例如,参见String.replace()) 如果您将方法更改为这样,它可能会起作用:

public String toString(){
    //In-Order - left,root,right.
    return toString(root,s);
}
public String toString(BSTNode root,String s){
    if (root!=null){
         return toString(root.right,toString(root.left,s)+","+root.data);
    }
    return "";
}

答案 1 :(得分:3)

当你创建一个String数组并传递时,基本上它是创建String对象(就像我们使用new operator创建的那样)。因此它起作用相同的引用并在处理时修改String。但在前一种情况下,它将它们视为两个单独的变量,如原始类型在java中处理。

public class StringTest {
  public static void main(String[] args) {
  String s[] = new String[1];
  System.out.println("before: "+s[0]);
  updateString(s);
  System.out.println("after: " + s[0]);
}
  private static void updateString(String s[]) {
  s[0] = "New String";
  }
}

程序的输出是:

before: null
after: New String

否则,它不会打印任何内容。