如何判断序列是不是堆:三步快速核验
如何判断序列是不是堆,核心是依据完全二叉树存储规则,校验所有父节点数值与子节点的大小关系,先确认序列对应完全二叉树结构,再区分大顶堆、小顶堆类型,逐节点比对数值,满足对应大小规则即为合法堆序列,该方法仅适用于数组顺序存储的二叉堆序列,不适用于链式存储的堆结构。
序列堆的结构判定依据
堆在计算机存储中默认以数组顺序存储,对应完全二叉树结构,这是序列能成为堆的前置条件。完全二叉树转化的数组序列,不存在中间空缺的节点,所有节点按层从左到右依次排列。数组下标从0开始时,任意下标为i的节点,左子节点下标固定为2i+1,右子节点下标固定为2i+2,父节点下标固定为(i-1)//2,这是所有数值比对的基础公式。
无需复杂推演,你可以直接用下标公式定位所有父子节点,规避结构判断失误。普通二叉树对应的无序数组,不满足该下标对应规则,绝对无法构成堆序列,结构合规是数值合规的前提。
大顶堆序列的判断标准
大顶堆的核心规则是所有父节点数值大于等于左右子节点数值,堆顶(数组首个元素)是整个序列的最大值。你遍历数组中所有非叶子节点即可完成校验,无需遍历全部节点,非叶子节点的最大下标为(len(数组)//2)-1,超出该下标的节点均为叶子节点,无下层子节点,无需校验。
遍历过程中,只要发现任意一个父节点数值小于左子节点或右子节点数值,该序列就不是大顶堆。例如序列[9,7,8,3,2,6],所有非叶子节点9、7、8均大于对应子节点,属于合法大顶堆;若将数值替换为[9,8,7,3,9,6],节点8的子节点出现更大数值9,不满足规则,判定为非堆序列。
小顶堆序列的判断标准
小顶堆的核心规则是所有父节点数值小于等于左右子节点数值,堆顶为整个序列的最小值,节点遍历范围和下标对应规则与大顶堆完全一致,仅大小比对逻辑相反。你只需聚焦所有非叶子节点,逐一对比其与两个子节点的数值大小。
序列[2,3,5,6,4,7]符合小顶堆规则,所有父节点数值均不大于子节点数值。若序列中存在任一父节点数值大于子节点数值,直接判定不满足小顶堆要求,无需继续校验剩余节点。
两种堆序列核心规则对比
| 堆类型 | 核心数值规则 | 堆顶特征 | 校验节点范围 |
|---|---|---|---|
| 大顶堆 | 父节点≥子节点 | 序列最大值 | 0至(len//2)-1下标 |
| 小顶堆 | 父节点≤子节点 | 序列最小值 | 0至(len//2)-1下标 |
通用快速判断实操步骤
第一步确定数组长度,锁定所有需要校验的非叶子节点范围,剔除无需校验的叶子节点,减少重复计算量。第二步根据需要判定的堆类型,确定大小比对规则。第三步逐一对位父节点与左右子节点数值,全程只需单次遍历数组,时间复杂度为O(n),常规数据量下判定效率较高。
单次违规即判定失败。
该判定方法的适用边界是仅适配顺序存储的静态数组堆序列,针对动态扩容、频繁增删节点的堆结构,序列会临时破坏完全二叉树特性,无法用该静态方法判定。同时该规则仅适用于数值型堆序列,自定义对象类型的堆序列,需依据预设比对字段替代纯数值比对。
