📜  检查给定的二叉树是否是堆(1)

📅  最后修改于: 2023-12-03 15:26:49.444000             🧑  作者: Mango

检查二叉树是否是堆

在计算机科学中,堆通常是指堆数据结构。堆数据结构是一个可以被看做一棵树的数组对象。堆总是满足下列性质:即堆的父节点的键值或者大小总是保持固定的序关系而排列,比如小根堆中父节点的键值总是小于或等于任何一个子节点的键值。

我们可以通过检查给定的二叉树是否满足堆的性质来判断给定的二叉树是否是堆。

如何检查二叉树是否是堆

对于一个二叉树,如果它是一个堆,那么它的每一个节点都应该满足以下两个条件:

  1. 父节点的键值小于左右子节点的键值(小根堆)
  2. 左右子树也必须是一个堆

因此,我们可以使用递归算法来检查二叉树是否是堆。具体地,我们可以定义一个 isHeap 函数,用于检查当前节点以及其子树是否满足堆的性质。

def isHeap(root):
    # 如果节点为空,认为是一棵堆
    if not root:
        return True
    
    # 如果左右子节点都存在
    if root.left and root.right:
        # 检查堆的性质
        if root.val <= root.left.val or root.val <= root.right.val:
            return False
        # 递归检查左右子树
        return isHeap(root.left) and isHeap(root.right)
    
    # 如果只存在左子节点
    elif root.left:
        # 检查堆的性质
        if root.val <= root.left.val:
            return False
        # 递归检查左子树
        return isHeap(root.left)
    
    # 如果只存在右子节点
    elif root.right:
        # 检查堆的性质
        if root.val <= root.right.val:
            return False
        # 递归检查右子树
        return isHeap(root.right)
    
    # 如果左右子节点都不存在,认为是一棵堆
    else:
        return True
性能分析

该算法的时间复杂度为 $O(n)$,其中 $n$ 为二叉树的节点数,因为我们需要遍历每一个节点。空间复杂度取决于递归栈的深度,最坏情况下为 $O(n)$。

结论

通过 isHeap 函数,我们可以检查一个二叉树是否满足堆的性质,从而判断该二叉树是否为堆。