LeetCode算法心得——路径总和||(dfs+双端队列+链表)

大家好,我是晴天学长,简单树的经典题目,是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).总结

  • 递归的正确顺序。
  • 全局变量需要回溯,局部变量不用。
  • 双链表和双端队列的应用。

试题链接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴天学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值