题目描述:
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
比如上述: 输入的整数为 22,则可打印的路径有(10,5,7)和(10,12)
思路:
整个过程利用深度优先遍历DFS。
代码:
package offer;
import org.omg.PortableInterceptor.INACTIVE;
import sun.reflect.generics.tree.Tree;
import java.util.ArrayList;
import java.util.Stack;
public class TestNo24 {
static class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int val){
this.val = val;
}
}
public static void main(String[] args) {
TreeNode root = new TreeNode(10);
TreeNode node1 = new TreeNode(5);
TreeNode node2 = new TreeNode(12);
TreeNode node3 = new TreeNode(4);
TreeNode node4 = new TreeNode(7);
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
System.out.println(new TestNo24().FindPath(root,22));
}
ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root == null ){
return ret;
}
//递归调用
findPath(root,target,new ArrayList<>());
return ret;
}
public void findPath(TreeNode root, int target, ArrayList<Integer> cache){
if(root == null){
return;
}
int val = root.val;
int remainVal = target-val;
//当前节点列表
cache.add(val);
if(remainVal == 0 && root.left == null && root.right == null){
ret.add(new ArrayList<>(cache));
}
//处理叶子节点
findPath(root.left,remainVal,cache);
findPath(root.right,remainVal,cache);
//回溯到上一个节点
cache.remove(cache.size()-1);
}
}