递归写入内存中的字符串:Java

Recursively Writing to a String in Memory : Java

我是第一次与树木打交道。了解 preOrder、postOrder 和 inOrder 遍历。我在网上阅读的所有函数都只是将字符串打印到标准输出,例如:

    void printPreorder(Node node) {
        if (node == null) {
            return;
        }
        System.out.print(node.data + " ");
        
        printPreorder(node.left);
        
        printPreorder(node.right);
    }

如果我想在内存中写入一个字符串然后return结果怎么办?

    static class Node {
        int data;
        Node left;
        Node right;

        Node(int data) {
            this.data = data;
            this.left = null;
            this.right = null;
        }
    }

    public static String visit(Node node, String buffer) {
        if (node != null) {
            buffer += node.data + " ";
            visit(node.left, buffer);
            visit(node.right, buffer);
        }
        return buffer;
    }
    
    public static void main(String args[]) {
        Node n1 = new Node(1);
        Node n2 = new Node(2);
        Node n3 = new Node(5);
        Node n4 = new Node(3);
        Node n5 = new Node(4);
        Node n6 = new Node(6);

        n1.right = n2;
        n2.right = n3;
        n3.left = n4;
        n3.right = n6;
        n4.left = n5;

        System.out.println(visit(n1, ""));
    }

当我调试我的 preOrder 时,我注意到它在调用堆栈中将字符串恢复到以前的状态,尽管我的调用堆栈 return 使用了最新的字符串。

为什么字符串在内存中被覆盖,或者我怎样才能将我的函数修复为 return 所需的输出?

视觉树:

问题是你没有修改 buffer,而是 re-assign 给它一个新值,所以递归调用中发生的事情丢失了

缓冲区 = 缓冲区 + node.data + " ";


使用可变对象代替 StringBuilder

public static StringBuilder visit(Node node, StringBuilder buffer) {
    if (node != null) {
        buffer.append(node.data).append(" ");
        visit(node.left, buffer);
        visit(node.right, buffer);
    }
    return buffer;
}

// System.out.println(visit(n1, new StringBuilder()));

或者不使用一个收集值的对象,而是 return 它们

public static String visit(Node node) {
    if (node != null) {
        return node.data + " " + visit(node.left) + visit(node.right);
    }
    return "";
}

// System.out.println(visit(n1));