class Solution:
# @param {ParentTreeNode} root the root of binary tree
# @param {int} target an integer
# @return {int[][]} all valid paths
def binaryTreePathSum3(self, root, target):
def helper(root):
# ret: list<List<int>>
ret = []
if not root:
return ret
left_paths = helper(root.left)
right_paths = helper(root.right)
# 分别插入空路径,表示不包含一侧的路径的情况(不拐弯)
left_paths.append([])
right_paths.append([])
# 两两配对,符合条件的path加入res
for left in left_paths:
for right in right_paths:
# 这里给left的路径反向,因为需要从左到右的顺序,左边的路径应该从下向上
currPath = left[::-1] + [root.val] + right[:]
if sum(currPath) == target:
res.append(currPath)
del left_paths[-1]
del right_paths[-1]
# 生成当前node的所有path
ret = left_paths[:] + right_paths[:] + [[]]
for i in range(len(ret)):
ret[i] = [root.val] + ret[i]
return ret
res = []
helper(root)
# 把得到的所有路径的反向也加入结果
size = len(res)
for i in range(size):
if len(res[i]) > 1:
res.append(res[i][::-1])
return res
public class Solution {
/*
* @param root: the root of binary tree
* @param target: An integer
* @return: all valid paths
*/
public List<List<Integer>> binaryTreePathSum3(ParentTreeNode root, int target) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;
// 先traverse,得到所有的node
List<ParentTreeNode> treeNodeList = new ArrayList<>();
Deque<ParentTreeNode> stack = new LinkedList<>();
stack.addLast(root);
while (! stack.isEmpty()) {
ParentTreeNode node = stack.removeLast();
treeNodeList.add(node);
if (node.left != null) stack.addLast(node.left);
if (node.right != null) stack.addLast(node.right);
}
// 对每个node,dfs考虑所有从该node出发的所有路径
for (ParentTreeNode node : treeNodeList) {
dfs(node, target, new HashSet<ParentTreeNode>(),
new ArrayList<Integer>(), 0, res);
}
return res;
}
// 从一点出发,dfs,检查其到其他所有点的路径和
private void dfs(ParentTreeNode root, int target, Set<ParentTreeNode> visited,
List<Integer> path, int pathSum, List<List<Integer>> res) {
if (root == null || ! visited.add(root)) return; // if already visited root, return
path.add(root.val);
pathSum += root.val;
if (pathSum == target) res.add(new ArrayList<>(path));
// keep search left, right, parent
dfs(root.left, target, visited, path, pathSum, res);
dfs(root.right, target, visited, path, pathSum, res);
dfs(root.parent, target, visited, path, pathSum, res);
path.remove(path.size() - 1);
}
}