如何使用递归创建“条件字符串”

时间:2017-12-12 18:40:54

标签: java string eclipse recursion

我正在尝试实现一个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()方法的那个)没有更新。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

Java中的字符串是不可变的。这意味着你永远不会更改一个字符串,你只需要创建一个新字符串,现在你的变量指向它。

特别是,行result = result + "-";不会更改您最初传递的字符串。在该特定函数调用中,变量result现在包含一个完全不同的字符串,然后返回该字符串。这不会影响外部调用中result的值,实际上没有对返回的字符串进行任何操作。

修复只是将返回的字符串分配回result,如下所示:result = preorder(root.getLeft(), result);