题目:
输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
如二叉树root为{10,5,12,4,7},expectNumber为22
则合法路径有[[10,5,7],[10,12]]
数据范围:
树中节点总数在范围 [0, 5000] 内
-1000 <= 节点值 <= 1000
-1000 <= expectNumber <= 1000
示例:
输入:{10,5,12,4,7},22
返回值:[[10,5,7],[10,12]]
说明:返回[[10,12],[10,5,7]]也是对的
思路:
这一题就是上一题的plus,不仅要回答是不是可以,并且要把路线给出来,其实大同小异
没什么难的。
复杂度:
时间复杂度:遍历O(n)
空间复杂度:递归最差是O(n),一般为树高
代码:
public class Solution {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
ArrayList<Integer> cur = new ArrayList<>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int expectNumber) {
if(root==null) return res;
backtracking(root,expectNumber);
return res;
}
private void backtracking(TreeNode root,int expectNumber){
if(root == null) return;
cur.add(root.val);
expectNumber-=root.val;
if(expectNumber == 0&&root.right==null&&root.left==null) res.add(new ArrayList<>(cur));
backtracking(root.left,expectNumber);
backtracking(root.right,expectNumber);
//最关键的,回溯
cur.remove(cur.size()-1);
}
}