路径总和 Ⅱ Java

java 复制代码
public class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;

	TreeNode() {
	}

	TreeNode(int val) {
		this.val = val;
	}

	TreeNode(int val, TreeNode left, TreeNode right) {
		this.val = val;
		this.left = left;
		this.right = right;
	}
}

class Solution {
	public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        List<List<Integer>> list = new ArrayList();
        List<Integer> tempList = new ArrayList(); // 存放符合条件的节点
        dfs(list, tempList, root, targetSum);
        return list;
	}
    static void dfs(List<List<Integer>> list, List<Integer> tempList, TreeNode root, int targetSum) {
        if (root == null) return;
        targetSum -= root.val; // 减去该节点
        tempList.add(root.val); // 将当前节点加入tempList 
        if (root.left == null && root.right == null && targetSum == 0) list.add(new ArrayList(tempList)); // 判断是否为叶子节点,如果累积减去的值等于目标值则将tempList创建副本添加到list,一定要创建副本再存入防止tempList改变影响到list
        dfs(list, tempList, root.left, targetSum);
        dfs(list, tempList, root.right, targetSum);
        tempList.remove(tempList.size() - 1); // 回溯重置状态,撤回当前节点的存入
    }
}

或者用队列:

java 复制代码
class Solution {
	public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        List<List<Integer>> list = new ArrayList();
        Deque<Integer> tempList = new LinkedList();
        dfs(list, tempList, root, targetSum);
        return list;
	}
    static void dfs(List<List<Integer>> list, Deque<Integer> tempList, TreeNode root, int targetSum) {
        if (root == null) return;
        targetSum -= root.val;
        tempList.offerLast(root.val); // 当前节点添加到队尾
        if (root.left == null && root.right == null && targetSum == 0) list.add(new LinkedList(tempList));
        dfs(list, tempList, root.left, targetSum);
        dfs(list, tempList, root.right, targetSum);
        tempList.pollLast(); // 回溯重置,移除队尾节点
    }
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

相关推荐
长安第一美人9 小时前
C 语言可变参数(...)实战:从 logger_print 到通用日志函数
c语言·开发语言·嵌入式硬件·日志·工业应用开发
Larry_Yanan10 小时前
Qt多进程(一)进程间通信概括
开发语言·c++·qt·学习
superman超哥10 小时前
仓颉语言中基本数据类型的深度剖析与工程实践
c语言·开发语言·python·算法·仓颉
不爱吃糖的程序媛10 小时前
Ascend C开发工具包(asc-devkit)技术解读
c语言·开发语言
bu_shuo10 小时前
MATLAB奔溃记录
开发语言·matlab
韩立学长10 小时前
【开题答辩实录分享】以《自助游网站的设计与实现》为例进行选题答辩实录分享
java·mysql·spring
ss27310 小时前
线程池:任务队列、工作线程与生命周期管理
java·后端
不像程序员的程序媛10 小时前
Spring的cacheEvict
java·后端·spring
SAP小崔说事儿10 小时前
在数据库中将字符串拆分成表单(SQL和HANA版本)
java·数据库·sql·sap·hana·字符串拆分·无锡sap
凌云若寒10 小时前
半导体代加工企业标签模板痛点的全景式解决方案
java