113. Path Sum II

本文介绍了一种使用深度优先搜索(DFS)和回溯思想解决特定问题的方法。通过遍历二叉树,寻找所有从根节点到叶子节点的路径,这些路径上的节点值之和等于给定的目标值。文章详细解释了算法的实现过程,包括如何处理回溯操作,以确保正确性和效率。

题目描述

在这里插入图片描述

方法思路

搜索方法为深度优先搜索,遍历顺序为先序遍历。
本题中,因为满足要求的路径并不唯一,需要用回溯的思想来解决。
简述思路如下:
1、先序遍历,从根节点开始添加,然后搜索左子树,一直达到叶子节点,得到根叶路径5-4-11–7,检验是否满足要求。
2、随后进行回溯,从队列尾部删除一个数据,返回到根结点11,然后搜索其右子树,根叶路径为5-4-11-2,检验是否满足要求。
3、如此反复。
需要注意的是,执行回溯操作的两个位置:
1、遍历至叶节点,得到一个根叶路径,如果满足约束则保存,然后回溯到根结点。
2、一根节点的左右子节点遍历结束,如节点11的左右子节点7、2便利结束,则进行回溯,当前list存储的路径为5-4.

class Solution{
    //Runtime: 1 ms, faster than 99.94%
    //Memory Usage: 39.4 MB, less than 72.24%
    List<List<Integer>> result  = new LinkedList<List<Integer>>();
    public List<List<Integer>> pathSum(TreeNode root, int sum){
	    List<Integer> currentResult  = new LinkedList<Integer>();
	    dfs(root,sum,currentResult);
	    return result;
    }

public void dfs(TreeNode root, int sum, List<Integer> currentResult) {
	if (root == null) return;
    currentResult.add(root.val);
	
	if (root.left == null && root.right == null && sum == root.val) {
		//为什么要new呢?,如果直接添加,后续的改变发生,已经添加的集合也会做同样的改变。
		result.add(new LinkedList(currentResult));
		//don't forget to remove the last integer
		currentResult.remove(currentResult.size() - 1);
		return;
	} else {
		dfs(root.left, sum - root.val, currentResult);
		dfs(root.right, sum - root.val, currentResult);
	}
    
	currentResult.remove(currentResult.size() - 1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值