我正在尝试实现一个toString()
方法来打印AVL树的前序遍历。我想在节点中打印int或char,但如果它不存在,则打印短划线(-
)。到目前为止,这是我的代码。
public String toString() {
if(root != null) {
AVLNode<T> node = root;
String result = "";
return preorder(node, result);
}else {
return "Empty root";
}
}
private String preorder(AVLNode<T> root, String result) {
result = result + root.getElement().toString();
if(nodeCheckLeft(root)) {
preorder(root.getLeft(), result);
}else {
result = result + "-";
}
if(nodeCheckRight(root)) {
preorder(root.getRight(), result);
}else {
result = result +"-";
}
return result;
}
nodeCheck是一个有用的方法,我用它来知道节点是否为空。
预期结果将是:
Adding{'b'} --> "b--"
Adding{'b','a'} --> "ba---"
Adding{'b','a','d'} --> "ba--d--"
Adding{'b','a','d','c'} --> "ba--dc--"
这是一个完整的测试:
@Test
void testAdd() {
AVLTree<Character> a = new AVLTree <Character>();
a.add('b');
assertEquals("b--", a.toString());
a.add('a');
assertEquals("ba---", a.toString());
a.add('d');
assertEquals("ba--d--", a.toString());
a.add('c');
assertEquals("ba--dc--", a.toString());
a.add('g');
assertEquals("ba--dc--g--", a.toString());
a.add('i');
assertEquals("ba--dc--g-i--", a.toString());
a.add('h');
assertEquals("ba--dc--g-ih---", a.toString());
}
我在第4行得到的是b-
。我假设(我可能错了)问题是因为字符串在递归的“更深”分支上被更改,所以主分支(即将结果字符串返回到toString()
方法的那个)没有更新。有什么方法可以解决这个问题吗?
答案 0 :(得分:0)
Java中的字符串是不可变的。这意味着你永远不会更改一个字符串,你只需要创建一个新字符串,现在你的变量指向它。
特别是,行result = result + "-";
不会更改您最初传递的字符串。在该特定函数调用中,变量result
现在包含一个完全不同的字符串,然后返回该字符串。这不会影响外部调用中result
的值,实际上没有对返回的字符串进行任何操作。
修复只是将返回的字符串分配回result
,如下所示:result = preorder(root.getLeft(), result);