大家好,我是晴天学长,简单树的经典题目,是dfs的开端啊,需要的小伙伴可以关注支持一下哦!后续会继续更新的。
1) .路径总和||
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
示例 2:
输入:root = [1,2,3], targetSum = 5
输出:[]
示例 3:
输入:root = [1,2], targetSum = 0
输出:[]
提示:
树中节点总数在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
2) .算法思路
路径总和:
1.用这个List<List> ret = new LinkedList<List>();
存答案
2. Deque path = new LinkedList();
双向队列 ,可以实现栈
3.dfs
4.空的话,返回空(单亲节点)
5.把数据放入栈
6.左右节点。
7.把元素弹出
3) .算法步骤
1.创建一个二维列表 list 用于存储所有路径和等于目标和的路径。
2.创建一个双端队列 queue 用于保存当前路径上的节点值。
3.定义 pathSum 方法,接受一个二叉树的根节点 root 和目标和 targetSum 作为参数,并返回结果列表 list。
4.在 dfs 方法中,首先判断当前节点 root 是否为空,如果为空则直接返回。
5.将当前节点的值加入到队列末尾,同时将目标和减去当前节点的值。
6.如果当前节点是叶子节点(即左右子节点均为空),并且目标和等于0,则将当前路径添加到结果列表 list 中。
7.递归调用 dfs 方法,分别遍历当前节点的左子节点和右子节点,并传递更新后的目标和。
8.回溯,将队列末尾的节点值移除,以便继续遍历其他路径。
4).代码示例
class Solution {
List<List<Integer>> list = new LinkedList<>();
Deque<Integer> queue = new LinkedList<>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
dfs(root, targetSum);
return list;
}
private void dfs(TreeNode root, int targetSum) {
if (root == null) return;
queue.offerLast(root.val);
targetSum -= root.val;
if (root.left == null && root.right == null && targetSum == 0) {
list.add(new ArrayList<>(queue));
}
dfs(root.left, targetSum);
dfs(root.right, targetSum);
queue.pollLast();
}
}
5).总结
- 递归的正确顺序。
- 全局变量需要回溯,局部变量不用。
- 双链表和双端队列的应用。
试题链接: