题目:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
思路:首先要注意:必须是从根节点到叶节点的路径才是有效的路径,若是根节点到内部节点的一条路径,则无效。 由于二叉树递归的结构特性,所以可以考虑用递归解题:
1)首先判断输入整数和当前节点的值是否相同,若相同且该节点为叶节点,则将当前路径放入符合题意的路径集合中,然后再递归检查左右子树,其他情况则直接对左右子树进行递归检查。
2)在一层递归退出之前,必须将本层递归进入的节点删除,这样才不会干扰其他递归调用时路径中的节点值。
代码实现(已在牛客网AC):
import java.util.ArrayList;
private ArrayList<ArrayList<Integer>> paths = new ArrayList<ArrayList<Integer>>();
private ArrayList<Integer> path = new ArrayList<>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
//健壮性以及边界条件
if(root == null)
return paths;
//先将当前节点值添加入path
path.add(root.val);
target -= root.val;
//当前path符合题意
if(target == 0 && root.left == null && root.right == null)
{
// 注意:使用该构造函数构造新的ArrayList对象,而非直接将path加入paths
paths.add(new ArrayList<Integer>(path));
}
FindPath(root.left, target);
FindPath(root.right, target);
// 重要!
path.remove(path.size()-1);
return paths;
}