涉及二叉树遍历,可以从深度优先遍历和广度优先遍历考虑。
    针对此题,深度优先遍历是后序遍历,对于递归后序遍历,要解决的首要问题是如何保存当前节点的祖先节点?可以设置一个全局path变量,它是一个列表,记录当前节点的祖先节点,当遍历到当前节点时,将当前节点加入列表,当当前节点的左右子树遍历完毕后,就将当前节点从列表中删除。
    针对此题,广度优先遍历就是层次遍历,同样要解决的首要问题是如何保存当前节点的祖先节点?
    可以设置一个HashMap,以当前节点为Key,以父节点为Value,当寻找到一个满足路径和的叶子节点,就查找HashMap得到叶子节点到根节点的路径。

    1. public void pathSum(TreeNode root, int currentSum, int targetSum) {
    2. if (root == null) {
    3. return;
    4. }
    5. currentSum += root.val;
    6. current.add(root.val);
    7. if(root.left == null && root.right == null && currentSum == targetSum){
    8. List<Integer> list = new ArrayList<>(current);
    9. ret.add(list);
    10. }
    11. pathSum(root.left, currentSum, targetSum);
    12. pathSum(root.right, currentSum, targetSum);
    13. current.remove(current.size() - 1);
    14. }