問題の説明
二分木と値の合計が与えられた場合、ルートノードからリーフノードまでのノード値の合計が合計に等しいパスを見つけます。
入力の説明:
二分木、合計、および
出力の説明:
条件を満たすすべてのパスを出力します
例
例1
入力
すると、次の二分木、sum = 22、
出力
[
[5,4,11,2]、
[5,8,9]
]
ソリューション
分析
- 深さ優先探索トラバーサル法が採用され、トラバースされたパスがバックトラッキング法によって記録され、各パスが条件を満たすかどうかが判断されます。
深さ優先トラバーサル:フォローノードからトラバースし、特定のパスをリーフノードにトラバースするまで延長してから戻り、他のパスをトラバースし続けます。
バックトラッキング方法:(簡単な説明:すべてのステップを試し、前のステップに戻る場合条件が満たされない)
は一種の最適化です。ヒューリスティック法とも呼ばれる検索方法は、目標を達成するために最適な条件に従って前方に検索します。しかし、あるステップに到達すると、元の選択がうまくいかなかったり、目標が達成されなかったりするので、1つのステップに戻ってもう一度選択します。このテクニックは、うまくいかない場合に戻ってもう一度やり直します。遡及的方法。
方法
- 深さ優先探索トラバーサル法が採用され、トラバースされたパスがバックトラッキング法によって記録され、各パスが条件を満たすかどうかが判断されます。
再帰的分析
再帰的パラメーター:
結果:すべての結果を格納します;パス:現在アクセスされているパスを格納します;ルート:バイナリツリー;合計:パスと
終了条件:
1。合計を満たさないリーフノードに
到達します2.リーフノードに到達しますパスsum is sum
再帰的コンテンツ:
1。パスにノードを追加します
2.再帰的な左ノードと右ノード
3.バックトラッキングポイント:前のステップの結果を削除します
コード
// 思路1
public class Solution {
private void dfs (ArrayList<ArrayList<Integer>> result, ArrayList<Integer> path, TreeNode root, int sum) {
if (root == null) {
return;
}
// 到达叶子节点,路径和为sum
if (root.left == null && root.right == null) {
// 到达叶子节点,没有满足sum
if (sum - root.val == 0) {
path.add(root.val);
result.add(new ArrayList<>(path));
path.remove(path.size() - 1);
}
// 到达叶子节点,没有满足sum
return;
}
// 路径中添加节点
path.add(root.val);
// 递归左节点和右节点
dfs(result, path, root.left, sum - root.val);
dfs(result, path, root.right, sum - root.val);
// 回溯点
path.remove(path.size() - 1);
}
}
時間計算量分析:
深さ優先探索トラバーサルはすべてのノードをトラバースするため、時間計算量はO(n)です。
スペースの複雑さの分析:
追加のスペースパスがバックトラッキングストレージパスの構造として適用されるため、パスの最長パスはn(つまり、ツリーはリンクリスト構造)であり、スペースの複雑さはO(n)です。
テストしたい場合は、Niuke.comのリンクに直接アクセスしてテストを行うことができます