題目:輸入一顆二叉樹的根節點和一個整數,打印出二叉樹中結點值的和爲輸入整數的所有路徑。路徑定義爲從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的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);
}
}