华为 · 树 · 算法编程题
华为 时限 1 秒 / 256 MB

题目描述

在一次 Prompt 工程实践中,我们把一段 token 序列抽象成一棵二叉树。树中每个结点都有一个整数权值(可正可负,也可能为 0)。请在这棵树中选出一棵“价值最大”的子树,并把这棵子树按“完全二叉树的层序数组”形式输出。
子树的价值定义为它所包含的所有结点权值之和。
允许对某个结点“剪掉”对总和贡献为负的整棵子树(即可以只要左子树、或只要右子树、或两者都要;被剪掉的位置在输出中以 null 占位)。
输入是一棵“用层序数组表示的完全二叉树”,缺失位置用 null 占位;输出也使用相同规则表示挑选出的那棵最优子树,并且去除末尾多余的尾部 null。

输入输出

输入描述
一行:用方括号包裹的一维数组,表示树的层序遍历;缺失结点用 `null`。例如:`[5,-1,3,null,null,4,7]`。
约定:
1.数组下标从 0 开始;对下标 i,左孩子为 2i+1,右孩子为 2i+2。
2.仅当该位置不是 `null` 才视为存在结点。
输出描述
一行:选择的“最大和子树”的层序数组表示(仍以 `null` 占位),并删除末尾无意义的连续 `null`。

样例共 1 组

样例 1 · 以 3 为根的子树和为 3+6+7=16;整棵树在剪掉负贡献的左侧后,总和为 1+16=17,为全局最大。按完全二叉树层序输出时,左子树位置及其两个孩子以 null 占位。
输入
[1,-2,3,-4,-5,6,7]
输出
[1,null,3,null,null,6,7]

算法解析依据一般

考点:树

限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

参考方向:树

树结构上的遍历(DFS 求子树信息 / BFS 求层序),多数树题是「后序遍历 + 回溯」。

思路框架(树 通法 · 非本题专属)

  1. 按输入建图(父子关系一般给父节点编号,孩子用邻接表存)。
  2. 确定遍历方式:自底向上合并子树信息(后序 DFS)或自顶向下传参(前序 DFS)。
  3. 对每个节点,用孩子的答案合并出当前节点的答案。
  4. 涉及层间操作(如层序变换)时用 BFS 逐层处理。

实现要点:递归深度可能到 1e5,注意递归爆栈;必要时改迭代或调整递归深度。

复杂度:时间 O(n) | 空间 O(n)

该范式的通法易错点

  • 递归深度过大导致爆栈。
  • 建树时父子关系方向搞反(把树当成有向图但遍历方向错)。
本题在源数据中没有官方考点标签,方向由题面特征推断,仅供参考。

样例解读

样例 1:输入 [1,-2,3,-4,-5,6,7] → 输出 [1,null,3,null,null,6,7]

以 3 为根的子树和为 3+6+7=16;整棵树在剪掉负贡献的左侧后,总和为 1+16=17,为全局最大。按完全二叉树层序输出时,左子树位置及其两个孩子以 null 占位。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2025年秋招-华为-11月19号AI岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解