当前位置:网站首页>LeetCode - 112. 路径总和;113. 路径总和 II【进阶】
LeetCode - 112. 路径总和;113. 路径总和 II【进阶】
2022-08-06 21:03:00 【NPE~】
LeetCode - [112、113]
一、LeetCode - 112. 路径总和;

路径总和:从根节点出发到叶子节点,为一条路径,将途经的节点值全部加起来,判断是否与targetSum相等
1 定义process函数,处理节点流程
node如果为叶子节点,表明一条路径已经到头了,判断是否节点值总和是否与targetSum相等;
如果是非叶子节点,则加上当前节点值,再调用process函数进行递归
public void process(TreeNode node, int preSum, int targetSum){
if(node == null){
if(preSum == targetSum){
flag = true;
return;
}
}
//node为叶子节点
if(node.left == null && node.right == null){
if(preSum + node.val == targetSum){
flag = true;
return;
}
}
//node为非叶子节点
preSum += node.val;
if(node.left != null){
process(node.left, preSum, targetSum);
}
if(node.right != null){
process(node.right, preSum, targetSum);
}
}
2 全部代码
/** * Definition for a binary tree node. * 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 boolean flag = false;
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root == null){
return false;
}
process(root, 0, targetSum);
return flag;
}
public void process(TreeNode node, int preSum, int targetSum){
if(node == null){
if(preSum == targetSum){
flag = true;
return;
}
}
//node为叶子节点
if(node.left == null && node.right == null){
if(preSum + node.val == targetSum){
flag = true;
return;
}
}
//node为非叶子节点
preSum += node.val;
if(node.left != null){
process(node.left, preSum, targetSum);
}
if(node.right != null){
process(node.right, preSum, targetSum);
}
}
}
二、LeetCode - 113. 路径总和 II【进阶】

本题目在要求在找出是否有路径的基础上让我们找出所有可能的路径,并且放入一个List集合返回
首先,我们需要定义一个List<Integer> list列表,用来存储我们path路径上经过的节点的值
其次,我们需要定义一个copy函数,用来复制list列表中的值,因为list是引用传递,如果直接传list会影响原来的值
1 process处理函数
public void process(TreeNode node, List<Integer> path, int preSum, int targetSum, List<List<Integer>> ans){
//node为叶子节点
if(node.left == null && node.right == null){
if(preSum + node.val == targetSum){
path.add(node.val);
ans.add(copy(path));
path.remove(path.size() - 1);
}
return;
}
//node为非叶子节点
path.add(node.val);
preSum += node.val;
if(node.left != null){
process(node.left, path, preSum, targetSum, ans);
}
if(node.right != null){
process(node.right, path, preSum, targetSum, ans);
}
path.remove(path.size() - 1);
}
1.1 node为叶子节点时
当node为叶子节点时,表明一条路径到了尽头,判断preSum(该路径之前经过的节点值总和) + node.val(当前节点的值) 是否等于 targetSum,如果等于,就将node.val添加进path(list集合),然后调用copy函数,复制list集合中的值,最后移除list集合中末尾的值【恢复现场,换另一条路,看看能否满足要求】
//node为叶子节点
if(node.left == null && node.right == null){
if(preSum + node.val == targetSum){
path.add(node.val);
ans.add(copy(path));
path.remove(path.size() - 1);
}
return;
}
1.2 node为非叶子节点时
当前node如果为非叶子节点,首先将node.val添加进path列表,同时更新preSum的值
判断:node.left与node.right是否为null,如果不为null,递归调用函数
整个函数最后需要恢复现场【移除path列表中最后的值】
//node为非叶子节点
path.add(node.val);
preSum += node.val;
if(node.left != null){
process(node.left, path, preSum, targetSum, ans);
}
if(node.right != null){
process(node.right, path, preSum, targetSum, ans);
}
path.remove(path.size() - 1);
2 copy函数
public List<Integer> copy(List<Integer> path){
List<Integer> list = new ArrayList<>();
for(Integer i : path){
list.add(i);
}
return list;
}
3 全部代码
/** * Definition for a binary tree node. * 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>> ans = new ArrayList<>();
if(root == null){
return ans;
}
List<Integer> path = new ArrayList<>();
process(root, path, 0, targetSum, ans);
return ans;
}
public void process(TreeNode node, List<Integer> path, int preSum, int targetSum, List<List<Integer>> ans){
//node为叶子节点
if(node.left == null && node.right == null){
if(preSum + node.val == targetSum){
path.add(node.val);
ans.add(copy(path));
path.remove(path.size() - 1);
}
return;
}
//node为非叶子节点
path.add(node.val);
preSum += node.val;
if(node.left != null){
process(node.left, path, preSum, targetSum, ans);
}
if(node.right != null){
process(node.right, path, preSum, targetSum, ans);
}
path.remove(path.size() - 1);
}
public List<Integer> copy(List<Integer> path){
List<Integer> list = new ArrayList<>();
for(Integer i : path){
list.add(i);
}
return list;
}
}
边栏推荐
猜你喜欢

Reproduce one loop problem and two loop problems

Deep understanding of isolation (MVCC, snapshot, undo log, Read View)

pycharm turn off cursor blinking

STM32MP157A | 05 - driver development based on RGB LCD LTDC interface drivers

多线程---进阶

Pytest学习-yaml+parametrize接口实战

什么是鸟撞?该如何设计防鸟撞的建筑?#可持续设计

Es nested object

AVL树插入新节点后调整的四种情况(左单旋、右单旋、双旋)

R-Breaker下的可转债策略
随机推荐
【How to use Medooze to realize multi-party video conference】
Before start of result set报错(已解决)
STM32MP157A驱动开发 | 05 - 基于LTDC接口驱动RGB LCD
Before start of result set error (resolved)
【WPF】Combobox默认样式学习笔记(Presenter和Trigger)
Danger!Please replace BeanUtils in your code now!!!
硅谷课堂第八课-腾讯云点播管理模块(三)
uniapp 左滑删除效果一、效果二(2个方式自选其一)(整理)
geemap学习1:geemap的安装和配置
硅谷课堂第十四课-直播对接和微信分享
【PyTorch量化实践(1)】
硅谷课堂第六课-腾讯云点播管理模块(一)
uniapp 左滑删除效果二、效果一(2个方式自选其一)(整理)
nuScenes数据集浅探(待完善……)
mysql索引
多线程---进阶
uniapp Jiugongge lottery function effect demo (sorting)
硅谷课堂第五课-腾讯云对象存储和课程分类管理
Servlet中上传文件(用到DiskFileItemFactory)
uniapp Jiugongge lottery controllable probability effect demo (sorting)