题目描述
给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径, 例如: 给出如下的二叉树,sum=22,
返回 [ [5,4,11,2], [5,8,9] ]
示例1
输入
{1,2},1
返回值
[]
示例2
输入
{1,2},3
返回值
[[1,2]]
思路:使用递归
-
从根节点开始,遍历每一个结点(深度优先遍历),将该结点的值放入当前ArrayList中 -
判断当前结点是否为叶子结点 以及 当前的路径和是否与sum相等 -
步骤2中的两个条件都满足时,则将list加入到结果集中。否则回退,删除list的最后一个元素(该元素可能不是叶节点,也可能当前路径不等于sum)
import java.util.ArrayList;
public class TreeNodePutSum {
private ArrayList<ArrayList<Integer>> allList = new ArrayList();
public static void main(String[] args) {
}
/**
*
* @param root TreeNode类
* @param sum int整型
* @return int整型ArrayList<ArrayList<>>
*/
public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) {
// 树空
if(root==null){
return allList;
}
//1.初始当前的列表
ArrayList<Integer> pathList = new ArrayList();
// 2.深度优先遍历
dfs(allList,pathList,root,sum);
//3.返回路径集合
return allList;
}
//一、对root进行深度优先遍历
//result:所有路径和为sum的结果集 list:当前路径结点集 root:当前根节点 sum:当前所需的路径和
public void dfs(ArrayList<ArrayList<Integer>> allList,ArrayList<Integer> pathList, TreeNode root, int sum){
if(null == root){
return;
}
if(null == root.left && null == root.right){//为叶子节点
if(sum - root.val == 0){//加上该结点后,满足路径和sum
pathList.add(root.val);//将当前结点加入list
allList.add(new ArrayList<>(pathList));//将当前路径 加入 结果集
pathList.remove(pathList.size()-1);//去掉当前结点,继续下面的遍历
}
return;
}
pathList.add(root.val);
dfs(allList,pathList, root.left, sum-root.val);
dfs(allList,pathList, root.right, sum-root.val);
pathList.remove(pathList.size()-1);
}
}
|