先中序遍历获取每一个节点 做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;
}