public void dfsSearch (TreeNode root, List<String> curr, List<List<String>> res) {
curr.add(String.valueOf(root.val));
// a leaf node has been reached
if (root.left == null && root.right == null) {
res.add(curr);
return;
}
if (root.left != null) {
List<String> temp = new ArrayList<>(curr);
dfsSearch(root.left, temp, res);
}
if (root.right != null) {
List<String> temp = new ArrayList<>(curr);
dfsSearch(root.right, temp, res);
}
}
上面的代碼是一個使用dfs來查找二叉樹中從根到葉的所有路徑的方法,我的問題是,在遞歸調用上面的兩行中,爲什麼我需要實例化一個新列表並將此臨時列表(temp)傳遞給遞歸調用,爲什麼我不能只使用curr(函數中的參數)?爲什麼在遞歸調用之前實例化一個新列表?
爲了明確這個問題,在每次遞歸調用之前,爲什麼需要在這裏使用一個新的列表temp,並且不能使用curr來代替? –
由於curr正在遞歸修改。想象一下,你沿着二叉樹的左邊走下去(這就是你在DFS中所做的)。你打了一片葉子,因此curr有通向第一片葉子的路徑。然後當你從遞歸棧中彈出時,如果你使用相同的curr,你會向右移動並添加正確的子節點,因此curr不正確地擁有來自先前遞歸調用的葉子,並且現在具有正確的子節點。 –
我認爲值得一提的是List是一個引用類型。這意味着當你將'curr'列表作爲參數傳遞時,它不會爲被調用的新方法創建一個新對象。它與調用方法具有相同的對象,這就是爲什麼你不爲'res'列表創建一個臨時列表,你想在所有遞歸調用中修改相同的列表 –