import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @param sum int整型
* @return int整型ArrayList<ArrayList<>>
思路:使用递归
1. 从根节点开始,遍历每一个结点(深度优先遍历),将该结点的值放入当前ArrayList中
2. 判断当前结点是否为叶子结点 以及 当前的路径和是否与sum相等
3. 2中的两个条件都满足时,则将list加入到结果集中。
否则回退,删除list的最后一个元素(该元素可能不是叶节点,也可能当前路径不等于sum)
*/
ArrayList<ArrayList<Integer>> AllList = new ArrayList<>();
public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) {
// 树空
if(root==null){
return AllList;
}
//1.初始当前的列表
ArrayList<Integer> path = new ArrayList<>();
//2.深度优先遍历
dfs(AllList,path,root,sum);
//3.返回路径集合
return AllList;
}
//一、对root进行深度优先遍历
//result:所有路径和为sum的结果集 list:当前路径结点集 root:当前根节点 sum:当前所需的路径和
public void dfs(ArrayList<ArrayList<Integer>> result,ArrayList<Integer> list,TreeNode root,int sum){
if(root==null){
return;
}
if(root.left==null && root.right==null){//为叶子节点
if(sum-root.val==0){//加上该结点后,满足路径和sum
list.add(root.val);//将当前结点加入list
result.add(new ArrayList<>(list));//将当前路径 加入 结果集
list.remove(list.size()-1); //去掉当前结点,继续下面的遍历
}
return;
}
list.add(root.val);
dfs(result,list,root.left,sum-root.val);
dfs(result,list,root.right,sum-root.val);
list.remove(list.size()-1);
}
}
|