輸入一顆二叉樹的根節點和一個整數,打印出二叉樹中結點值的和爲輸入整數的所有路徑。路徑定義爲從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,數組長度大的數組靠前)
1.還是老話,根結點爲空 / target小於0,直接走人。(任何一個路徑都是大於等於0嘰)
2.我們來看它的返回值,ArrayList<ArrayList<Integer>>?俄羅斯娃娃,套裝,哈哈哈哈哈哈。
將找到的單個路徑封裝起來,在添加到結果集中。
3.遍歷結點之前,先將結點加入到單個路徑中。
4.每一次從子節點回到父結點的時候,都需要在路徑上刪除子節點。
import java.util.ArrayList;
/**
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public static void main(String args[]) {
}
//單個滿足條件的路徑
ArrayList<Integer> list = new ArrayList<>();
//找到所有滿足條件的路徑
ArrayList<ArrayList<Integer>> path = new ArrayList<>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
if(root != null) {
list.add(root.val);
//當單個路徑加入一個元素,則 target 的值就要減去相應的值。
target -= root.val;
boolean isLeaf = root.left == null && root.right == null;
//從根到葉子的路徑上值加和等於target時,才能將給路徑放到結果集中。
if (target == 0 && isLeaf) {
path.add(new ArrayList<>(list));
} else {
//不是葉子結點,遍歷它的左右結點。
FindPath(root.left, target);
FindPath(root.right, target);
}
//回退的時候,需要刪除單個路徑中父結點。
list.remove(list.size() - 1);
}
return path;
}
}