涉及二叉树遍历,可以从深度优先遍历和广度优先遍历考虑。
针对此题,深度优先遍历是后序遍历,对于递归后序遍历,要解决的首要问题是如何保存当前节点的祖先节点?可以设置一个全局path变量,它是一个列表,记录当前节点的祖先节点,当遍历到当前节点时,将当前节点加入列表,当当前节点的左右子树遍历完毕后,就将当前节点从列表中删除。
针对此题,广度优先遍历就是层次遍历,同样要解决的首要问题是如何保存当前节点的祖先节点?
可以设置一个HashMap,以当前节点为Key,以父节点为Value,当寻找到一个满足路径和的叶子节点,就查找HashMap得到叶子节点到根节点的路径。
public void pathSum(TreeNode root, int currentSum, int targetSum) {if (root == null) {return;}currentSum += root.val;current.add(root.val);if(root.left == null && root.right == null && currentSum == targetSum){List<Integer> list = new ArrayList<>(current);ret.add(list);}pathSum(root.left, currentSum, targetSum);pathSum(root.right, currentSum, targetSum);current.remove(current.size() - 1);}
