跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript算法

华为 OD 机试:二维伞雨滴效应的 BST 验证与实现

针对华为 OD 机试中的二维伞雨滴效应问题,提供基于 JavaScript 的完整解决方案。核心在于验证输入序列是否构成二叉搜索树的前序遍历,并据此提取左右两侧叶子节点的值。通过栈结构优化验证流程,结合递归构建树形结构定位边界值,确保算法的高效性与正确性。

战神发布于 2024/3/12更新于 2026/6/819 浏览
华为 OD 机试:二维伞雨滴效应的 BST 验证与实现

二维伞的雨滴效应解题思路

问题背景

在华为 OD 机试中,这类题目通常考察对数据结构特性的理解。所谓的'二维伞',本质上是一个二叉搜索树(BST)。雨滴落在伞面流到伞坠的过程,对应着树中数据的流向。我们需要完成两个任务:一是判断给定的正整数序列是否合法地构成了一个 BST 的前序遍历;二是如果合法,找出这棵树最左侧和最右侧的叶子节点数值。

核心逻辑分析

要解决这个问题,不能直接暴力枚举。我们需要利用 BST 的性质:左子树所有节点小于根,右子树所有节点大于根。

1. 验证前序遍历合法性

前序遍历的顺序是'根 - 左 - 右'。验证时,我们可以维护一个栈来记录当前路径上的节点。每当遇到比栈顶小的元素,说明进入了左子树;如果遇到比栈顶大的元素,需要回溯父节点,直到找到合适的插入位置。这个过程可以在 O(N) 时间内完成。

2. 提取'伞坠'信息

题目中的'伞坠'实际上指的是叶子节点。由于是二叉搜索树,最左侧的伞坠对应中序遍历的第一个叶子,最右侧对应最后一个叶子。为了准确获取,我们可以在验证通过后,根据前序序列重建这棵树(或模拟构建过程),然后分别寻找最左和最右的叶子。

代码实现

下面给出完整的 JavaScript 实现。注意处理边界情况,比如数组为空或只有一个元素的情况。

function solve(preorder) {
  if (!preorder || preorder.length === 0) return [0]; // 非法

  let isValid = true;
  let root = null;

  // 这里使用递归方式构建树并验证,逻辑更直观
  function buildTree(index, min, max) {
    if (index[0] >= preorder.length) return null;
    
    const val = preorder[index[0]];
    if (val < min || val > max) return null;

    index[0]++;
    const node = { val };
    node.left = buildTree(index, min, val);
    node.right = buildTree(index, val, max);
    return node;
  }

  const idx = [0];
  root = buildTree(idx, -Infinity, Infinity);

  // 如果构建过程中没有消耗完所有节点,或者树结构不完整导致剩余节点无法匹配,则视为非法
  if (idx[0] !== preorder.length) {
    isValid = false;
  }

  if (!isValid) return [0];

  // 寻找最左和最右叶子
  let leftLeaf = null;
  let rightLeaf = null;

  function findLeaves(node) {
    if (!node) return;
    if (!node.left && !node.right) {
      if (!leftLeaf) leftLeaf = node.val;
      rightLeaf = node.val; // 每次更新都会覆盖,最后即为最右
    }
    findLeaves(node.left);
    findLeaves(node.right);
  }

  findLeaves(root);

  return [1, leftLeaf, rightLeaf];
}

调试与注意事项

在实际提交时,记得处理输入输出的格式转换。有些测试用例可能包含重复值,但 BST 定义通常不包含重复键,需确认题目要求。另外,单节点树也是合法的,此时左右伞坠为同一个值。

总结

这道题的关键在于将抽象的物理模型映射回标准的数据结构操作。掌握 BST 的验证方法,配合简单的树遍历,就能轻松拿下。

目录

  1. 二维伞的雨滴效应解题思路
  2. 问题背景
  3. 核心逻辑分析
  4. 1. 验证前序遍历合法性
  5. 2. 提取“伞坠”信息
  6. 代码实现
  7. 调试与注意事项
  8. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 零基础入门与实践指南
  • VS Code 结合 Overleaf Workshop 插件实现 AI 辅助 LaTeX 写作
  • FPGA 从 RTL 到比特流:Vivado 与 Modelsim 联合开发全流程解析
  • LangBot 企业级即时通讯 AI 机器人平台
  • Ubuntu 22.04 安装配置 OpenClaw 实战指南
  • 基于 OpenAI、LangChain 和 MongoDB 构建 AI Agent
  • Cursor Agent Skills 实战指南:打造专属前端 AI 助手
  • C++ 四叉树数据结构原理与实现
  • 企业级招聘数据采集实战:基于 Bright Data AI Studio 的自动化方案
  • C++ 构造数据类型知识点梳理
  • 前端流式输出技术:原理与实战指南
  • Git 安装与配置完整指南
  • Linux 环境变量详解:从底层原理到实战操作
  • Solidity 函数修饰符 (Modifier) 详解与实战
  • 基于 Coze 平台构建企业级 AI 客服机器人的实战指南
  • LeetCode 160:相交链表解题思路与代码实现
  • AI 大模型提示工程技术指南:从基础概念到思维链应用
  • Linux 命名管道(FIFO)跨进程通信原理与实操
  • GitHub Copilot 学生认证指南:免费获取 Pro 版权限
  • 基于无人机的多模态目标检测:高多样性基准与基线方法

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online