SWE Intern · OA DSA Multiple Choice

Rippling OA 判断合法 Max Heap:完全树结构与父子次序

数组表示天然固定完全二叉树形状,逐个验证父值不小于左右子值;原选择项未公开,不猜答案编号。

题目重点:数组表示天然固定完全二叉树形状,逐个验证父值不小于左右子值;原选择项未公开,不猜答案编号。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练函数输入层序数组,数组下标 i 的孩子 2i+1/2i+2;这表示没有洞的完全二叉树。若输入是指针树或图,仍须额外验证形状。
  • 允许相等值,空数组与单节点视为合法堆;原选择项可能要求非空,这里只为代码测试定义。

解题路线

  1. 先检查表示:层序连续数组隐含从左到右填满最后一层,因而无需再搜索缺口;指针树则必须做层序见空后不得再见非空的结构检查。
  2. 从 child=1 扫到 n−1,其父下标 `(child−1)//2`;如父值小于孩子则立即拒绝,全部通过即满足 max-heap 局部有序条件。
  3. 最大堆只保证根是全局最大,不要求同一层左到右有序,也不保证任意子树按 BST 排列。
  4. 题目没有选项,所以文章给判定法,不能声称某个选项正确。对 9,841 个短数组用独立父节点显式条件核对。

手动走一遍

[9,7,8,2,6] 合法;[9,7,8,10] 不合法,因为下标 3 的父下标 1 值 7<10。数组 [9,8,7] 合法,即使同层 8>7 或反过来都不影响堆性质。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

def is_max_heap(values: list[int]) -> bool:
    """A flat array already encodes a complete binary tree."""
    return all(values[(child - 1) // 2] >= values[child] for child in range(1, len(values)))


def build_max_heap(values: list[int]) -> list[int]:
    result = values.copy()
    n = len(result)
    for root in range(n // 2 - 1, -1, -1):
        parent = root
        while 2 * parent + 1 < n:
            child = 2 * parent + 1
            if child + 1 < n and result[child + 1] > result[child]:
                child += 1
            if result[parent] >= result[child]:
                break
            result[parent], result[child] = result[child], result[parent]
            parent = child
    return result

复杂度

遍历 n−1 条父子关系,时间 O(n)、辅助空间 O(1);若输入为指针树,检查完全性需 BFS 队列最坏 O(n) 空间。

易错点与追问

容易失分的边界

  • 只核根是最大值,没有核所有父子。
  • 把兄弟之间排序当堆条件。
  • 指针树有结构空洞却只核值大小。
  • 将 max-heap 与 BST 性质混用。

继续深挖

  • 数组为何天然表示完全二叉树?
  • 指针树怎样验证结构完整?
  • 允许重复值吗?
  • 为什么建堆只需处理最后一个非叶节点往上?
✓已复制微信号!