问题描述:
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:
在进行二叉树中结点的值和对应的整数的值进行比较的同时需要注意的是利用递归的思想,记录的是一条路径就是用ArrayList来进行存储,类型也是ArrayList,在进行递归查询的时候,定义的是根到叶子节点才算一条路径,所以不仅和得满足条件,还得都为null才可以,所以当递归到头的时候回退的时候需要将之前的遍历过的结点删除,重新遍历其他结点.
具体递归的细节过程参考之前写的:递归的情况
/**
* @ Author zhangsf
* @CreateTime 2019/7/13 - 10:40 AM
*/
package com.bjut.qiu;
import java.util.ArrayList;
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class SameTree {
//由于要进行递归,所以两个arraylist在函数外面创建,防止被覆盖
ArrayList<ArrayList<Integer>> arraylist=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> in=new ArrayList<Integer>();
public static void main(String[] args) {
}
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
//递归到输入根节点为空,则此条路径的深度遍历结束
if(root==null)
{
return arraylist;
}
//用list来记录路径
in.add(root.val);
//每次选取一个节点后,就减去那个节点的值
target=target-root.val;
//因为定义的是根到叶子节点才算一条路径,所以不仅和得满足条件,还得都为null
//这样才会将这条路径加入到out当中
if(target==0&&root.left==null&root.right==null)
{
arraylist.add(new ArrayList<Integer>(in));
}
//递归左节点
FindPath(root.left,target);
//递归右节点
FindPath(root.right,target);
//每次删除list的最后一个元素,将路径退回来,在思路图中讲解
in.remove(in.size()-1);
//每次都把目前的out返回给上一次递归
return arraylist;
}
}