寻找二叉树和为特定值的路径(纯属个人笔记,写的乱)

首先想到二叉树,我们肯定会想到

1.前序、后序以及中序遍历。
2.广度优先、深度优先遍历;

关于这题找路径:肯定时深度优先;
错误代码:

class Solution {
    List<List<Integer>> res=new LinkedList();
      LinkedList<Integer> path=new LinkedList();
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
       
       return dfs(root,sum) ;
    }
    public  List<List<Integer>> dfs(TreeNode root,int sum){
        ~~~~if(root==null){~~ 
            if(sum==0){
                res.add(path);
            }else{
                path.removeLast();
            } 
        }~~ //上面这种判断时错误的,如果当root不为空时,sum已经为0,这就是错误的。root是否为空和sum是否为0不能放在一个if语句里,这时两种情况,应该时并列的if语句进行判断;
        path.add(root.val);
         sum=sum-root.val;
        dfs(root.left,sum);
        dfs(root.right,sum);
        return res;

    }
}

正确的写法应该是:

class Solution {
    List<List<Integer>> res=new LinkedList();
      LinkedList<Integer> path=new LinkedList();
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
       dfs(root,sum) ;
       return res;
    }
    public  void  dfs(TreeNode root,int sum){
        if(root==null){
           return ;
        }
        sum=sum-root.val;
        path.add(root.val);
        if(sum==0&&root.left==null&&root.right==null){
            res.add(new LinkedList(path));//在
        }
        dfs(root.left,sum);
        dfs(root.right,sum);
        path.removeLast();
            }
}

两者区别在于边界条件的处理上。

if(sum==0&&root.left==null&&root.right==null){
            res.add(new LinkedList(path));//在
        }

在这一块我一开始犯了一个错误就是直接

res.add(path);//输出是[[],[]]

因为在链表res中,每个值及每个里面的元素(也是链表)都是一个新的链表(new LInkedList()),只是这个新链表还是与path的值一样。
这就是我一开始想到怎么去当path填满然后满足要求又清空的问题。就用上面的new LInkedList()不断添加新链表。

你可能感兴趣的:(Java刷题)