题目描述

输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

解题思路

首先我们知道这题肯定要用 DFS,当一次遍历完成后,如果输入整数值恰好等于节点值之和,则输出这条路径并且回退一个节点;如果不等于则直接回退一个节点,即回退到当前节点的父节点,如果该父节点有右孩子,则继续遍历,否则继续回退。考虑回退到根节点,此时如果它有右孩子,则继续遍历,否则整个DFS 结束。需要注意的是不论路径的值是否等于输入整数值,都要回退,也就是使用 remove 函数移除路径上的最后一个节点。

代码实现

  1. import java.util.ArrayList;
  2. /**
  3. public class TreeNode {
  4. int val = 0;
  5. TreeNode left = null;
  6. TreeNode right = null;
  7. public TreeNode(int val) {
  8. this.val = val;
  9. }
  10. }
  11. */
  12. public class Solution {
  13. ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();;
  14. ArrayList<Integer> ans = new ArrayList<Integer>();;
  15. public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
  16. if(root != null){
  17. ans.add(root.val);
  18. if(root.val == target && root.left == null && root.right == null) {
  19. result.add(new ArrayList<Integer>(ans));
  20. }
  21. else {
  22. if(root.left != null)
  23. FindPath(root.left, target-root.val);
  24. if(root.right != null)
  25. FindPath(root.right, target-root.val);
  26. }
  27. ans.remove(ans.size()-1);
  28. }
  29. return result;
  30. }
  31. }