华为OD机考双机位C卷 - 二维伞的雨滴效应 (Java & Python & JS & GO & C++ & C)

2 阅读3分钟

二维伞的雨滴效应

2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷

华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)

题目描述

普通的伞在二维平面世界中,左右两侧均有一条边,而两侧伞边最下面各有一个伞坠子,雨滴落到伞面,逐步流到伞坠处,会将伞坠的信息携带并落到地面,随着日积月累,地面会呈现伞坠的信息。

1、为了模拟伞状雨滴效应,用二叉树来模拟二维平面伞(如下图所示),现在输入一串正整数数组序列(不含0,数组成员至少是1个) ,若此数组序列是二叉搜索树的前序遍历的结果,那么请输出一个返回值1,否则输出0.

2、同时请将此序列构成的伞状效应携带到地面的数字信息输出来(左边伞坠信息,右边伞坠信息,详细参考示例图地面上数字),若此树不存在左或右扇坠,则对应位置返回0。同时若非 二叉排序树那么左右伞坠信息也返回0。

输入描述

1个通过空格分割的整数序列字符串,数组不含0,数组成员至少1个,输入的数组的任意两个数字都互不相同,最多1000个正整数,正整数值范围1~655350

输出描述

输出如下三个值,以空格分隔: 是否二叉排序树,左侧地面呈现的伞坠数字值,右侧地面呈现的伞坠数字值. 若是二叉排序树,则输出1,否则输出0 (其左右伞坠值也直接赋值0) 。 若不存存在左侧或者右侧伞坠值,那么对应伞坠值直接赋值0。

用例

输入

8 3 1 6 4 7 10 14 13

输出

1 1 13 

说明

1表示是二叉搜索 树前序遍历结果,1表示左侧地面呈现的伞坠数字值,13表示右侧地面呈现的伞坠数字值

解题思路

这道题目主要涉及两个核心问题:

  1. 判断给定的前序遍历序列是否能构成一个有效的二叉搜索树(BST)
  2. 找出"伞坠"的位置并输出其值

核心算法思想

1. 二叉搜索树判断与构建

这个问题使用了一个巧妙的方法,同时完成BST的判断和构建

  • 分区思想:在BST的前序遍历中,根节点后紧跟的是左子树节点,然后是右子树节点
  • 值域约束:BST中,左子树的所有节点值必须小于根节点,右子树的所有节点值必须大于根节点

算法步骤:

  1. 对于当前子树范围[start, end],根节点值为preOrder[start]
  2. 从start+1开始寻找第一个大于等于根节点的位置i,则[start+1, i-1]为左子树范围
  3. 从i开始检查到end,所有值必须大于根节点,否则不是有效BST
  4. 递归检查左子树和右子树

这种方法的时间复杂度为O(n²),其中n是序列长度。

2. 伞坠值获取

伞坠值对应二叉树最左侧和最右侧的叶子节点:

  • 左伞坠:从根开始,总是尽量往左走,如果左子节点为空才往右

  • 右伞坠:从根开始,总是尽量往右走,如果右子节点为空才往左

  • level参数:用于区分根节点和其他节点,只有level>0时才返回叶子节点的值