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

//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值如何重置为每个树路径的二叉树的根值?

最佳答案

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

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

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

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

10-06 10:03