我是第一次和樹木打交道。學習 preOrder、postOrder 和 inOrder 遍歷。我在網上閱讀的所有函式都只是將字串列印到標準輸出,例如:
void printPreorder(Node node) {
if (node == null) {
return;
}
System.out.print(node.data " ");
printPreorder(node.left);
printPreorder(node.right);
}
如果我想寫入記憶體中的字串然后回傳結果怎么辦?
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 時,我注意到它會將字串恢復到呼叫堆疊中的先前狀態,盡管我的呼叫堆疊回傳了最新的字串。
為什么字串在記憶體中被覆寫,或者如何修復我的函式以回傳所需的輸出?
視覺樹:
uj5u.com熱心網友回復:
問題是您不修改buffer
,而是將其重新分配給新值,因此遞回呼叫中發生的事情丟失了
緩沖區=緩沖區 節點資料 “”;
使用可變物件,而不是像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()));
或者不要使用一個收集值的物件,而是回傳它們
public static String visit(Node node) {
if (node != null) {
return node.data " " visit(node.left) visit(node.right);
}
return "";
}
// System.out.println(visit(n1));
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/470043.html
上一篇:bash腳本中的遞回awk