输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)。
思路
(1)真正的递归条件是if (root == null){ return ;}
记住永远是当前层,这样才是完整的递归!
(2)其实end condition 2
与后面的recurisive
是并列关系,是else{ recurisive }
。end condition 2
并不是真正的递归终止条件,只是中间操作步骤。与前面的list2.add(root.val);
为一体。
(3)list2.remove(list2.size()-1);
递归的真正执行步骤。在树形结构中,当前node在叶子结点C1=B1.left
时,先遍历叶结点C1的左子结点D1,返回空;在执行遍历叶节点的右子结点D2,返回空。再去执行后面的尾部代码(此处就是删除该结点),到}
结束后,返回到父级递归调用处B1点,进行当前结点C2=B1.right
的后序遍历。
(4)返回值写成void。因为list 引用关系。
解法
nowcoder的AC
提交时间:2020-01-11 ,语言:Java ,运行时间: 22 ms ,占用内存:9668K ,状态:答案正确
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<ArrayList<Integer>> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
if (root == null){
return list1;
}
findPath(root,target,list1,list2);
return list1;
}
void findPath(TreeNode root, int target, ArrayList<ArrayList<Integer>> list1, ArrayList<Integer> list2) {
// error1, end condition1
if(root == null){
return ;
}
list2.add(root.val);
//end condition 2
if (root.left == null && root.right == null){
int sum = 0;
for (int i=0;i<list2.size();i++){
sum = sum + list2.get(i);
}
if (sum == target){
list1.add(new ArrayList<>(list2));
//return ; error2
}
// special ,error3
//list2.remove(list2.size()-1);
//return ;
}
// recurisive
findPath(root.left,target,list1,list2);
findPath(root.right,target,list1,list2);
// how to remove the element ,error4
list2.remove(list2.size()-1);
}
}