【问题标题】:String parameter during recursion递归期间的字符串参数
【发布时间】:2015-11-05 00:13:51
【问题描述】:

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

//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));
    }
}

现在这会打印正确的路径值,但我不明白,因为我更新了 onePath 并且不重置它,如何将每个单独路径的值重置为 root.val? 即使在我为前一个路径附加“->”+ val 之后,onePath 值如何重置为每个树路径的二叉树根值?

【问题讨论】:

    标签: java recursion


    【解决方案1】:

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

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

    当对printPaths(..,..,"something" + "someNumber") 的调用返回时,包含somethingsomeNumber 的本地onePath 变量(在该方法调用的堆栈框架上)可以被垃圾回收,并且引用@987654331 的onePath 变量@"something" 在当前栈帧中。

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

    【讨论】:

      猜你喜欢
      • 2018-09-09
      • 2020-05-21
      • 2012-09-15
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 2013-04-06
      • 2017-10-28
      • 2016-07-14
      相关资源
      最近更新 更多