输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:
对于树的遍历一般就是深度遍历和广度遍历下四种中的一种,从根节点往下找到叶节点形成一条路径,若是和为给定的值这个路径便是需要找的路径,从根节点到叶节点边访问边相加判断可以采用前序遍历。
(1)若根节点的值大于给定的值或者根节点为空,则清空路径;
(1)若根节点的值等于给定的值,需要判断当前节点是否为叶子节点,若为叶子节点,则是需要找的一条路径,若不是,将保存的节点全部清空。
(2)若根节点的和小于给定的值,则分别去访问其左右子树。
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target)
{
ArrayList<ArrayList<Integer>> pathlist = new ArrayList<ArrayList<Integer>>();
if(root == null || root.val > target)
return pathlist;
ArrayList<Integer> path = new ArrayList<Integer>();
findPath(root,target,pathlist,path);
return pathlist;
}
private void findPath(TreeNode root,int target,ArrayList<ArrayList<Integer>> pathlist,ArrayList<Integer> path)
{
//如果节点为空,或者值小于target此条路径清空
if(root == null || root.val > target)
{
path.clear();
}
else if(root.val == target)//如果当前节点等于target且为叶子节点则直接将它添加到path中,否则这条路径清空
{
if(root.left == null && root.right==null)
{
path.add(root.val);
pathlist.add(path);
}
else
{
path.clear();
}
}
else //当根节点的值小于target,则递归去寻找它的左右子树
{
path.add(root.val);
ArrayList<Integer> path2 = new ArrayList<Integer>();
path2.addAll(path);
target -= root.val;
findPath(root.left,target,pathlist,path);
findPath(root.right,target,pathlist,path2);
}
}