我正在尝试递归遍历一个BST预序,但我不能使它工作。 这就是我所尝试的:
public String PreOrder() {
return preOrderStringBuild(root, "");
}
public String preOrderStringBuild(Node root, String preOrderString) {
if (root == null) {
return "";
}
preOrderString += root.key + " ";
preOrderStringBuild(root.left, preOrderString);
preOrderStringBuild(root.right, preOrderString);
return preOrderString;
}
但这只给了我第一个元素。。。 我在这里做错了什么?
在Java中,方法参数按值传递,字符串是不可变的。
这意味着这行代码不会更改传递到方法中的字符串,而是创建了一个新字符串,该字符串只能在方法的当前调用中看到:
preOrderString += root.key + " ";
解决这个问题的一种方法是使用一种可变的字符串类型,如StringBuilder,而不是string。 对可变对象的更改在方法外部可见。
public String preOrderStringBuild(Node root, StringBuilder preOrderString) {
...
preOrderString.append(root.key + " "); // instead of preOrderString = ...
...
另一种解决方法是确保使用递归调用返回的值。 通过这条路线,您甚至不需要传递正在构建的字符串。
public String preOrderStringBuild(Node root) {
if (root == null) {
return "";
}
String preOrderString = root.key + " "
+ preOrderStringBuild(root.left)
+ preOrderStringBuild(root.right);
return preOrderString;
}