Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归期间的字符串参数_Java_Recursion - Fatal编程技术网

Java 递归期间的字符串参数

Java 递归期间的字符串参数,java,recursion,Java,Recursion,我想了解以下递归代码的功能,这些代码基本上打印二叉树的路径 //Node has int val; Node left; Node right; public List<String> printPaths(Node root) { List<String> paths = new ArrayList<String>(); printPaths(root, paths, Integer.toString(root.val)); //root i

我想了解以下递归代码的功能,这些代码基本上打印二叉树的路径

//Node has int val; Node left; Node right;
public List<String> printPaths(Node root) {
    List<String> paths = new ArrayList<String>();
    printPaths(root, paths, Integer.toString(root.val)); //root is not null
    return paths;
}

public void printPaths(Node root, List<String> paths, String onePath) {
    if(root.left == null && root.right == null) {
        paths.add(onePath);
    }
    if (root.left != null) {
        printPaths(root.left, paths, onePath + Integer.toString(root.left.val));
    }
    if (root.right != null) {
        printPaths(root.left, paths, onePath + Integer.toString(root.right.val));
    }
}
//节点具有int-val;左淋巴结;节点权;
公共列表打印路径(节点根){
列表路径=新的ArrayList();
printPaths(root,path,Integer.toString(root.val));//root不为null
返回路径;
}
公共void打印路径(节点根、列表路径、字符串路径){
if(root.left==null&&root.right==null){
添加(onePath);
}
if(root.left!=null){
printPaths(root.left,paths,onePath+Integer.toString(root.left.val));
}
if(root.right!=null){
打印路径(root.left,paths,onePath+Integer.toString(root.right.val));
}
}
现在,这将打印正确的路径值,但我不明白,因为我更新了onePath&不要重置它,如何将每个单独的路径的值重置为root.val?
即使在我为前一个路径添加“->”+val之后,如何将每个树路径的onePath值重置为二叉树的根值?

字符串是不可变的,使用
+
运算符连接两个字符串将创建一个新的
字符串
实例。连接的原始
字符串
实例保持不变

因此,每个递归方法调用在调用堆栈上都有自己的
onePath
局部变量,它引用不同的
String
实例

当调用
printPaths(…,…,“something”+“someNumber”)
返回时,包含
somethingsomeNumber
的本地
onePath
变量(在该方法调用的堆栈框架上)可以被垃圾收集,而
onePath
变量引用
字符串
“something”
位于当前堆栈帧中


唯一改变的是当前堆栈帧。

字符串
是不可变的,使用
+
运算符连接两个字符串将创建一个新的
字符串
实例。连接的原始
字符串
实例保持不变

因此,每个递归方法调用在调用堆栈上都有自己的
onePath
局部变量,它引用不同的
String
实例

当调用
printPaths(…,…,“something”+“someNumber”)
返回时,包含
somethingsomeNumber
的本地
onePath
变量(在该方法调用的堆栈框架上)可以被垃圾收集,而
onePath
变量引用
字符串
“something”
位于当前堆栈帧中

唯一改变的是当前堆栈帧