2015-11-04 83 views
1

我想了解基本上打印二叉树路径的下列递归代码的功能。递归期间的字符串参数

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

回答

4

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

因此,每个递归方法调用具有调用堆栈,其指的是不同String例如在其自己的onePath局部变量。

当含有somethingsomeNumberprintPaths(..,..,"something" + "someNumber")返回一个呼叫时,本地onePath变量(该方法调用堆栈帧)可以是垃圾收集,所述onePath变量指String"something"是在当前堆栈帧。

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