- 先中序遍历获取每一个节点
- 做dfs,以每个节点做为起点开始做回溯
方法1:DFS
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> binaryTreePathSum3(ParentTreeNode root, int target) {
if (root == null) return res;
List<ParentTreeNode> nodeList = new ArrayList<>();
inOrder(root, nodeList);
for (ParentTreeNode node : nodeList) {
Set<ParentTreeNode> set = new HashSet<>();
dfs(node,set,new ArrayList<>(),target);
}
return res;
}
private void inOrder(ParentTreeNode root, List<ParentTreeNode> nodeList) {
if (root == null) return;
inOrder(root.left, nodeList);
nodeList.add(root);
inOrder(root.right, nodeList);
}
private void dfs(ParentTreeNode root, Set<ParentTreeNode> set, List<Integer> path, int target) {
if (root == null || set.contains(root)) return;
set.add(root);
path.add(root.val);
target -= root.val;
if (target == 0) {
res.add(new ArrayList<>(path));
}
dfs(root.left, set, path, target);
dfs(root.right, set, path, target);
dfs(root.parent, set, path, target);
set.remove(root);
path.remove(path.size() - 1);
target += root.val;
}