回溯法DFS

二叉树根节点到叶子节点和为指定值的路径

http://www.nowcoder.com/questionTerminal/840dd2dc4fbd4b2199cd48f2dadf930a

import java.util.ArrayList;

public class 根节点到叶子节点的路径和 {

/**
 * 使用回溯法,从根节点开始。每遍历一个节点,就将该节点的值放入路径中,
 * 判断是否为叶子节点,当前nowsum是否与sum相等,
 * 相等就将list加入到结果中,否则回退,回退要将list的最后一个元素删除。
 */
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) {
    // write code here
    ArrayList<Integer> path=new ArrayList<>();
    if (root==null)return res;
    dfs(root,0,sum,path); 
    return res;
}

public void dfs(TreeNode root, int nowsum, int sum, ArrayList<Integer> list){
    list.add(root.val);
    //判断是否为叶子节点,当前nowsum是否与sum相等,
    if (root.right==null&&root.left==null&&sum==(nowsum+root.val)){
        //相等就将list加入到结果中,
        res.add(new ArrayList<>(list));return;
    }
    if (root.left!=null) {
        dfs(root.left,nowsum+root.val,sum,list);
        list.remove(list.size()-1);
    }
    if (root.right!=null){
        dfs(root.right,nowsum+root.val,sum,list);
        list.remove(list.size()-1);
    }
}

}

全部评论
list相当于是一个往res中添加数据的中介容器,每完成一次添加后需要清空,不然后面再用这个中介就会有之前重复的残余。再new 一个list就达到了清空list的目的
1 回复 分享
发布于 2021-05-16 15:26
刚从c转java,请问20行为什么不能是res.add(list)呢?
点赞 回复 分享
发布于 2021-03-10 15:51

相关推荐

斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
哪个好一点
败哭:我感觉校园经历不是对口的感觉没必要,项目经历没有具体数值代表产出,自我评价过多
点赞 评论 收藏
分享
5 收藏 评论
分享
牛客网
牛客企业服务