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”
位于当前堆栈帧中
唯一改变的是当前堆栈帧