題目描述
輸入一顆二叉樹和一個整數(shù),打印出二叉樹中結(jié)點值的和為輸入整數(shù)的所有路徑。路徑定義為從樹的根結(jié)點開始往下一直到葉結(jié)點所經(jīng)過的結(jié)點形成一條路徑。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
private int sum = 0;
private ArrayList<ArrayList<Integer>> array = new ArrayList<ArrayList<Integer>>();
private ArrayList<Integer> a = new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
find(root, target);
return array;
}
private void find(TreeNode root, int target) {
if(root == null)
return;
sum += root.val;
if(sum < target) {
a.add(root.val);
find(root.left, target);
find(root.right, target);
a.remove(a.size() - 1);
sum -= root.val;
}else {
if(sum > target) {
sum -= root.val;
return;
}else {
if(root.left == null && root.right == null) {
ArrayList<Integer> temp = new ArrayList<Integer>();
for(int i : a){
temp.add(i);
}
temp.add(root.val);
array.add(temp);
}
sum -= root.val;
return;
}
}
}
public static void main(String[] args) {
Solution obj = new Solution();
int[] arr = {10,5,12,4,7};
TreeNode root = build(arr);
obj.FindPath(root, 22);
}
private static TreeNode build(int[] arr){
Queue<TreeNode> queue = new LinkedList<TreeNode>();
if(arr == null || arr.length == 0) {
return null;
}
TreeNode root = new TreeNode(arr[0]);
int i = 0;
int length = arr.length;
queue.add(root);
while(!queue.isEmpty()) {
TreeNode temp = queue.poll();
i++;
if(i <length) {
TreeNode left = new TreeNode(arr[i]);
temp.left = left;
queue.add(left);
}else{
temp.left = null;
}
i++;
if(i < length) {
TreeNode right = new TreeNode(arr[i]);
temp.right = right;
queue.add(right);
}else {
temp.right = null;
}
}
return root;
}
}