题目链接:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
解题思路:
路径问题一般用回溯法+递归偏多,当这条路径到底如果还没发现,就删除最后一个节点。
1 import java.util.ArrayList; 2 /** 3 public class TreeNode { 4 int val = 0; 5 TreeNode left = null; 6 TreeNode right = null; 7 8 public TreeNode(int val) { 9 this.val = val; 10 11 } 12 13 } 14 */ 15 public class Solution { 16 ArrayList<ArrayList<Integer>> res = new ArrayList<>(); 17 ArrayList<Integer> path = new ArrayList<>(); 18 public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) { 19 if (root == null) { 20 return res; 21 } 22 findPath(root, target); 23 return res; 24 } 25 26 public void findPath(TreeNode root, int target) { 27 //因为FindPath中和 下面程序中都进行了判null操作,root绝对不可能为 null 28 path.add(root.val); 29 //已经到达叶子节点,并且正好加出了target 30 if (root.val == target && root.left == null && root.right == null) { 31 //将该路径加入res结果集中 32 res.add(new ArrayList(path)); 33 } 34 //如果左子树非空,递归左子树 35 if (root.left != null) { 36 findPath(root.left, target - root.val); 37 } 38 //如果右子树非空,递归右子树 39 if (root.right != null) { 40 findPath(root.right, target - root.val); 41 } 42 //无论当前路径是否加出了target,必须去掉最后一个,然后返回父节点,去查找另一条路径,最终的path肯定为null 43 path.remove(path.size() - 1); 44 return; 45 } 46 }