2015-11-04 2 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 для каждого отдельного пути? Как значение onePath получает исходное значение двоичного дерева для каждого пути дерева даже после добавления «->» + val для предыдущего пути?

ответ

4

A String является неизменным и объединяет две строки с оператором +, создавая новый экземпляр String. Исходные экземпляры String, которые были объединены, остаются неизменными.

Следовательно, каждый вызов рекурсивного метода имеет свою собственную локальную переменную onePath в стеке вызовов, которая относится к другому экземпляру String.

Когда вызов printPaths(..,..,"something" + "someNumber") возвращается, локальная onePath переменная (на стеке кадр этого вызова метода), который содержал somethingsomeNumber может быть мусора, а onePath переменная, которая относится к String"something" находится в текущем кадре стека.

Единственное, что меняется, это текущий стек стека.