当前位置: 首页 > news >正文

LeetCode 解题思路 24(Hot 100)

在这里插入图片描述

解题思路:

  1. 确定根节点: 前序遍历的第一个元素是当前子树的根节点。
  2. ​分割中序数组: 在中序遍历中找到根节点的位置,其左侧为左子树的中序,右侧为右子树的中序。
  3. 递归构造子树: 根据左子树的长度,分割前序数组,分别构造左子树和右子树。

Java代码:

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        Map<Integer, Integer> inorderMap = new HashMap<>();
        for (int i = 0; i < inorder.length; i++)
            inorderMap.put(inorder[i], i);

        return buildHelper(preorder, 0, preorder.length - 1,
                           inorder, 0, inorder.length - 1,
                           inorderMap);
    }

    private TreeNode buildHelper(int[] preorder, int preStart, int preEnd,
                                  int[] inorder, int inStart, int inEnd,
                                  Map<Integer, Integer> inorderMap) {
    
        if (preStart > preEnd || inStart > inEnd) return null;

        int rootVal = preorder[preStart];
        TreeNode root = new TreeNode(rootVal);

        int rootIndex = inorderMap.get(rootVal);
        int leftSize = rootIndex - inStart;

        root.left = buildHelper(preorder, preStart + 1, preStart + leftSize,
                                inorder, inStart, rootIndex, inorderMap);
        root.right = buildHelper(preorder, preStart + leftSize + 1, preEnd,
                                inorder, rootIndex + 1, inEnd, inorderMap);
        
        return root;
    }
}

复杂度分析:

  • 时间复杂度: O(n),每个节点仅被处理一次,哈希表查询时间为 O(1),总共有 n 个节点。
  • 空间复杂度: O(n),递归栈的深度取决于树的高度,最坏情况下(链表树)为 O(n)。哈希表存储中序遍历的值到索引的映射,占用 O(n) 空间。

在这里插入图片描述

解题思路:

  1. 前缀和与哈希表: 维护一个哈希表 prefixSum,记录从根节点到当前路径的前缀和及其出现次数。初始化时存入 {0: 1},用于处理从根节点开始的路径。
  2. 递归遍历: 对每个节点,计算当前前缀和 currentSum。检查是否存在 currentSum - targetSum 在哈希表中,若存在则累加对应次数到结果。将当前前缀和加入哈希表,递归处理左右子树,回溯时撤销当前前缀和的记录。
  3. 路径灵活处理: 路径不需要从根开始或结束在叶子,但必须向下。通过哈希表动态维护当前路径的前缀和,确保路径连续性。

Java代码:

class Solution {
    private int result = 0;

    public int pathSum(TreeNode root, int targetSum) {
        Map<Long, Integer> prefixSum = new HashMap<>();
        prefixSum.put(0L, 1);
        dfs(root, 0, prefixSum, targetSum);
        return result;
    }

    private void dfs(TreeNode node, long currentSum, Map<Long, Integer> prefixSum, int targetSum) {
        if (node == null) return;
        
        currentSum += node.val;
        result += prefixSum.getOrDefault(currentSum - targetSum, 0);
        prefixSum.put(currentSum, prefixSum.getOrDefault(currentSum, 0) + 1);

        dfs(node.left, currentSum, prefixSum, targetSum);
        dfs(node.right, currentSum, prefixSum, targetSum);

        prefixSum.put(currentSum, prefixSum.get(currentSum) - 1);
    }
}

复杂度分析:

  • 时间复杂度: O(n),每个节点仅被访问一次,哈希表操作(插入、查询、删除)均为 O(1)。
  • 空间复杂度: O(n),递归栈的深度取决于树的高度 h(最坏情况为链状树,h = n)。O(n) 哈希表最多存储 n 个不同的前缀和(例如,当所有节点值唯一且路径和互不相同时)。

相关文章:

  • 清华大学第12弹:《DeepSeek政务应用场景与解决方案》.pdf(文末附免费下载地址)
  • git_version_control_proper_practice
  • 【QT】Qlcdnumber的使用
  • C++11QT复习(二)
  • arm之s3c2440的I2C的用法
  • Pycharm社区版创建Flask项目详解
  • ArcGIS Pro属性表添加字段是灰色的,点不了?+属性表导出为excel表格
  • 2025年使用Scrapy和Playwright解决网页抓取挑战的方案
  • 天津大学第二讲:《深度解读DeepSeek:部署、使用、安全》|附PPT下载方法
  • 1、pytest基本用法
  • 【多学科稳定EI会议大合集】计算机应用、通信信号、电气能源工程、社科经管教育、光学光电、遥感测绘、生物医学等多学科征稿!
  • 文档处理控件Aspose.Words 教程:.NET版中增强的 AI 文档摘要功能
  • C#中 String类API(函数)
  • DeepSeek大模型 + 自建知识库:用AI打造“专属问答机器人”
  • 婚姻的解构与重构 | 一场关于选择与责任的探索
  • Java中java.time.Instant类的详细使用示例、注释及关键特性说明,以及和LocalDateTime对比
  • 【监控系列】prometheus
  • 数据库基础知识点(系列一)
  • leetcode1109. 航班预订统计-medium
  • 数据库——关系代数之基本操作
  • BNEF:亚洲、中东和非洲是电力基础设施投资的最大机会所在
  • 在差异中建共鸣,《20世纪美国文学思想研究》丛书出版
  • 清华数字政府与治理研究院揭牌:服务数字政府建设需求
  • 张家界乒乓球公开赛设干部职级门槛引关注,回应:仅限嘉宾组
  • 财政部、证监会:加强对会计师事务所从事证券服务业务的全流程监管
  • 韩国对华中厚板征收临时反倾销税