【树结构与栈】中等力扣练习题

二叉树中和为目标值的路径

给你二叉树的根节点 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]]

提示:

  • 树中节点总数在范围 [0, 5000]

  • -1000 <= Node.val <= 1000

  • -1000 <= targetSum <= 1000

    /**

    • 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 {
      List<List> ret = new LinkedList<List>();
      //存储路径的队列
      Deque path = new LinkedList();

      public List<List> pathSum(TreeNode root, int target) {
      //二叉树
      dfs(root, target);
      return ret;
      }

      public void dfs(TreeNode root, int target) {
      //根节点为空
      if (root == null) {
      return;
      }
      path.offerLast(root.val);
      target -= root.val;
      //子节点为空
      if (root.left == null && root.right == null && target == 0) {
      ret.add(new LinkedList(path));
      }
      //遍历左子树
      dfs(root.left, target);
      //遍历右子树
      dfs(root.right, target);
      path.pollLast();
      }
      }

彩灯装饰记录I

一棵圣诞树记作根节点为 root 的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照从 的顺序返回每一层彩灯编号。

复制代码
输入:root = [8,17,21,18,null,null,6]
输出:[8,17,21,18,6]

提示:

  1. 节点总数 <= 1000

    /**

    • Definition for a binary tree node.
    • public class TreeNode {
    • 复制代码
      int val;
    • 复制代码
      TreeNode left;
    • 复制代码
      TreeNode right;
    • 复制代码
      TreeNode(int x) { val = x; }
    • }
      */
      class Solution {
      ArrayList a=new ArrayList();
      public int[] levelOrder(TreeNode root) {
      Queue q=new LinkedList();
      //根节点为空
      if(root==null) return new int[0];
      //添加根节点
      q.add(root);
      //当队列中存储的节点不为空时,进行遍历
      while(!q.isEmpty()){
      TreeNode t=q.poll();
      //添加节点的数值
      a.add(t.val);
      //左边子节点不为空
      if(t.left!=null) q.add(t.left);
      //右边子节点不为空
      if(t.right!=null) q.add(t.right);
      }
      int[] re= new int[a.size()];
      //遍历查询列表中的值
      for(int i=0;i<a.size();i++){
      re[i]=a.get(i);
      }
      return re;
      }

    }

验证图书取出顺序

现在图书馆有一堆图书需要放入书架,并且图书馆的书架是一种特殊的数据结构,只能按照 一定 的顺序 放入拿取 书籍。

给定一个表示图书放入顺序的整数序列 putIn,请判断序列 takeOut 是否为按照正确的顺序拿取书籍的操作序列。你可以假设放入书架的所有书籍编号都不相同。

示例 1:

**输入:**putIn = 6,7,8,9,10,11, takeOut = 9,11,10,8,7,6

**输出:**true

**解释:**我们可以按以下操作放入并拿取书籍: push(6), push(7), push(8), push(9), pop() -> 9, push(10), push(11),pop() -> 11,pop() -> 10, pop() -> 8, pop() -> 7, pop() -> 6

示例 2:

复制代码
输入:putIn = [6,7,8,9,10,11], takeOut = [11,9,8,10,6,7]
输出:false
解释:6 不能在 7 之前取出。

提示:

  • 0 <= putIn.length == takeOut.length <= 1000

  • 0 <= putIn[i], takeOut < 1000

  • putIntakeOut 的排列。

    class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
    //创建栈
    Stack p1=new Stack();
    Stack p2=new Stack();
    int pop=0;
    for(int i=0;i<pushed.length;i++){
    //插入数值
    p1.push(pushed[i]);
    //只要查询的栈内数值不为空,或栈顶数值与取出的数值不相符时,进行循环
    while(!p1.isEmpty()&&popped[pop]==p1.peek()){
    //弹出数值
    p1.pop();
    pop++;
    }
    }
    //根据p1是否为空,判断取出顺序是否一致
    return p1.isEmpty();
    }
    }

相关推荐
小程故事多_807 小时前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
2601_956121979 小时前
二分算法(知识点+题目)
c++·算法
AndrewHZ11 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场12 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶13 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
玖玥拾13 小时前
LeetCode 88 合并两个有序数组
算法·leetcode
数据皮皮侠AI13 小时前
上市公司数字供应链金融指数(2010-2024)
大数据·人工智能·算法
小程故事多_8014 小时前
用GRPO算法重塑多智能体系统,从原理落地到复杂任务规划实战
人工智能·算法
Hi李耶14 小时前
【LeetCode】541.反转字符串 II
算法·leetcode·职场和发展
shylyly_14 小时前
104.二叉树的最大深度
数据结构·算法·104.二叉树的最大深度