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

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

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

战神发布于 2024/3/12更新于 2026/9/852 浏览
华为 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 = (index, val, max);
     node;
  }

   idx = [];
  root = (idx, -, );

  
   (idx[] !== preorder.) {
    isValid = ;
  }

   (!isValid)  [];

  
   leftLeaf = ;
   rightLeaf = ;

   () {
     (!node) ;
     (!node. && !node.) {
       (!leftLeaf) leftLeaf = node.;
      rightLeaf = node.; 
    }
    (node.);
    (node.);
  }

  (root);

   [, leftLeaf, rightLeaf];
}
buildTree
return
const
0
buildTree
Infinity
Infinity
// 如果构建过程中没有消耗完所有节点,或者树结构不完整导致剩余节点无法匹配,则视为非法
if
0
length
false
if
return
0
// 寻找最左和最右叶子
let
null
let
null
function
findLeaves
node
if
return
if
left
right
if
val
val
// 每次更新都会覆盖,最后即为最右
findLeaves
left
findLeaves
right
findLeaves
return
1

调试与注意事项

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

总结

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

目录

  1. 二维伞的雨滴效应解题思路
  2. 问题背景
  3. 核心逻辑分析
  4. 1. 验证前序遍历合法性
  5. 2. 提取“伞坠”信息
  6. 代码实现
  7. 调试与注意事项
  8. 总结

更多推荐文章

查看全部
  • 多模态 Agent 图像识别 Skills 开发实战:Web 全栈图像处理方案
  • 基于 Go 语言与 DeepSeek 大模型的 AIOps 监控系统构建
  • Unity-MCP 使用指南:让 AI 接管游戏开发
  • C++26 任务优先级队列内部机制解析
  • C++ 并发:内存序、可见性与指令重排
  • 基于 Rust 与 DeepSeek 构建高性能 Text-to-SQL 数据库代理服务
  • JDK 主流版本现状与选型建议
  • 未岚大陆 CES 2026 发布 Navimow 标准:零转全驱与激光雷达技术解析
  • C++与Go匿名函数编程对比
  • LIBERO:终身机器人学习的综合基准测试平台
  • Lada v0.10.1 本地 AI 视频去马赛克工具使用指南
  • 机器学习:决策树三兄弟 ID3、C4.5、CART 详解
  • 从非科班到准字节前端:开发之外的事是破局关键
  • 从零实现 STL vector 容器:深入理解动态内存管理
  • 前缀和算法实战:从一维到二维及哈希结合应用
  • C++ 套接字(Socket)技术详解
  • 本地Qwen + ComfyUI 制作AI漫剧教程
  • OpenClaw 全平台卸载指南:Windows、macOS、Linux、npm、pnpm
  • AMD 显卡运行 ComfyUI-Zluda 配置与优化指南
  • Android 开发核心知识点笔记:从基础原理到算法面试实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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