📜  给定二叉树的层序遍历,检查树是否是最小堆(1)

📅  最后修改于: 2023-12-03 14:56:53.196000             🧑  作者: Mango

检查二叉树是否为最小堆

最小堆是满足以下两个条件的二叉树:

  1. 任意一个非叶子节点的值不大于其子节点的值;
  2. 所有叶子节点都在同一层。

我们可以通过给定二叉树的层序遍历来检查该树是否为最小堆。

检查方法

我们可以按层序遍历的顺序,从上到下、从左到右逐个比较节点的值。

  1. 对于任意一个非叶子节点,分别检查其左右子节点的值是否大于该节点的值,如果有任意一个节点的值大于该节点,则该树不是最小堆。
  2. 对于所有叶子节点所在层的节点,检查是否存在一个节点的左右子节点都不为空,如果存在这样的节点,则该树不是最小堆。
时间复杂度

对于一颗有n个节点的二叉树,我们需要遍历每一个节点来检查是否满足最小堆的条件,因此时间复杂度为O(n)。

代码实现

下面给出了Python语言的代码实现示例:

from typing import List

def is_min_heap(nums: List[int]) -> bool:
    """
    检查给定二叉树的层序遍历是否为最小堆
    """

    n = len(nums)

    # 检查非叶子节点是否满足条件一
    for i in range(n // 2):
        left = nums[2 * i + 1]
        right = nums[2 * i + 2]

        if nums[i] > left or (right < n and nums[i] > right):
            return False

    # 检查叶子节点所在层是否满足条件二
    leaf_start = 2 ** ((n - 1).bit_length() - 1)
    leaf_end = n

    for i in range(leaf_start, leaf_end):
        if nums[i] is not None and (2 * i + 2 < leaf_end):
            return False

    return True

代码中的变量nums为按层序遍历得到的二叉树节点值的列表,其中若某个节点为空,用None代替。函数返回True表示该二叉树为最小堆,返回False表示不是。