package com.anuragkapur.ctci.treeandgraphs;
import com.anuragkapur.ds.tree.Node;
import java.util.ArrayList;
import java.util.List;
/**
* @author anuragkapur
*/
public class Prob4_9_AllPathsTotalTox {
/**
* Solution WIP - Need to properly handle mutability of list
*
* @param root
* @param total
* @return
*/
public List<List<Integer>> allPaths(Node<Integer> root, int total) {
List<List<Integer>> paths = new ArrayList<>();
dfs(root, new ArrayList<>(), paths);
List<List<Integer>> pathsWithSumX = new ArrayList<>();
for (List<Integer> path : paths) {
for (int i=0; i<path.size(); i++) {
int sum = 0;
List<Integer> pathWithSumX = new ArrayList<>();
for (int j=i; j<path.size(); j++) {
pathWithSumX.add(path.get(j));
sum += path.get(j);
if (sum == total) {
pathsWithSumX.add(pathWithSumX);
}
}
}
}
return pathsWithSumX;
}
private void dfs(Node<Integer> root, List<Integer> path, List<List<Integer>> paths) {
if (root == null) {
return;
}
path.add(root.getData());
if (root.getLeft() == null && root.getRight() == null) {
paths.add(path);
return;
}
List<Integer> leftPath = new ArrayList<>();
leftPath.addAll(path);
List<Integer> rightPath = new ArrayList<>();
rightPath.addAll(path);
dfs(root.getLeft(), leftPath, paths);
dfs(root.getRight(), rightPath, paths);
}
}