题目:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
思路:经典的动态规划问题,用递归的思路解决。判断当前节点是否是叶子节点,如果是叶子节点,对比target和叶子节点的value是否相等,相等则保存起来;否则用target减去当前节点的value,递归进入左右子树。
import java.util.ArrayList;
public class FindPath {
public static void main(String[] args) {
TreeNode root = new TreeNode(10);
TreeNode treeNode2 = new TreeNode(5);
TreeNode treeNode3 = new TreeNode(7);
TreeNode treeNode4 = new TreeNode(12);
root.left = treeNode2;
root.right = treeNode4;
treeNode2.right = treeNode3;
FindPath findPath = new FindPath();
ArrayList<ArrayList<Integer>> arrayLists = findPath.FindPath(root, 22);
System.out.println(arrayLists);
}
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>();
if(root == null) {
return arrayLists;
}
findSubPath(arrayLists, new ArrayList<>(), root, target);
return arrayLists;
}
public void findSubPath(ArrayList<ArrayList<Integer>> paths, ArrayList<Integer> path, TreeNode root, int target) {
path.add(root.val);
if (root.left == null && root.right == null) {
if (target == root.val) {
paths.add(path);
}
return;
}
ArrayList<Integer> subPath = new ArrayList<>();
subPath.addAll(path);
if (root.left != null) findSubPath(paths, path, root.left, target - root.val);
if (root.right != null) findSubPath(paths, subPath, root.right, target - root.val);
}
}