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を使う方法です。私の質問は、再帰呼び出しの上の2行で、なぜ新しいリストをインスタンス化する必要があるのですか?この一時リスト(temp)を再帰呼び出しに渡すと、curr(関数の引数)を使用できないのはなぜですか?再帰呼び出しの前に新しいリストをインスタンス化するのはなぜですか?
この質問を明確にするには、各再帰呼び出しの前に、なぜここで新しいリストtempを使用する必要があり、代わりにcurrを使用できないのでしょうか? –
currが再帰的に変更されているためです。あなたがバイナリツリーの左側を見ているとします(これはDFSでやることです)。あなたは葉を打つので、currは最初の葉への道を持っています。再帰スタックからポップすると、同じcurrを使用すると、右に移動して右の子ノードを追加するため、currは間違って以前の再帰呼び出しのリーフを持ち、今すぐ正しい子を持ちます。 –
私はそのリストに言及する価値があると思うリファレンスタイプです。これは、 'curr'リストをパラメータとして渡すと、呼び出されている新しいメソッドの新しいオブジェクトを作成しないことを意味します。呼び出し元のメソッドと同じオブジェクトです。そのため、 'res'リストの一時リストを作成せず、すべての再帰呼び出しで同じリストを変更する必要があります。 –