leetcode练习(bfs)113. 路径总和 II

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 22,

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \    / \
    7    2  5   1

返回:

[
[5,4,11,2],
[5,8,4,5]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-sum-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
搜索全部的路径,典型的BFS思想,如果这个叶子节点到根节点的路上的全部节点和为sum(target目标)那么就是一个列表,我们的一个问题在于,如何保存路上的结点。我们知道,java的引用是指向这个列表在堆中的位置,直接在引用上添加会影响下一步或者下一轮,所以我们每次到下一步时从之前的列表复制过去,new ArrayList(list)就能new出一个和之前一模一样的列表,同时更新current(当前和),或者更新sum(每次sum-root.val)当到达0时就是目标

class Solution {
	List> list=new ArrayList<>();	//放在函数外面,减少函数的参数,方便调用
    public List> pathSum(TreeNode root, int sum) {
    	if(root==null)	return list;
        BFS(root,sum,0,new ArrayList());//0是当前和,下一个参数是一个为空的列表
        return list;
    }
	private void BFS(TreeNode root, int target, int current, ArrayList l) {
		current+=root.val;		//用上次的和+当前结点的值作为当前和
		ArrayList l0=new ArrayList(l);	//从父节点位置的列表创建而来
		l0.add(root.val);		//加上这个结点,记录路程
		if(root.left==null&&root.right==null&¤t==target) {
			list.add(l0);		//到达路的末尾,并且和是满足target,list加上这个列表
			return ;
		}
		if(root.left!=null)		//对左孩子操作
			BFS(root.left,target,current,l0);
		if(root.right!=null)	//对右孩子操作
			BFS(root.right,target,current,l0);
	}
}

你可能感兴趣的:(leetcode,算法)