递归写入内存中的字符串: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));
我是第一次与树木打交道。了解 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));