Python实现最大堆插入函数测试失败,求代码问题排查
最大堆插入函数bug分析与修复
核心问题点
- 循环退出逻辑错误:当满足终止条件(父节点值≥插入值/已到根节点)时,仅设置了循环终止标记
b=False,但没有跳过后续的交换逻辑,导致最后一次不必要的错误交换,这是本次测试用例失败的直接原因。 - 入参修改逻辑错误:每次调用函数都会直接修改传入的原数组,在头部插入占位0,若同一个堆数组多次调用插入接口会出现逻辑混乱,不符合函数无副作用的通用设计要求。
错误触发逻辑说明
你的测试用例执行到第二次循环时,当前节点索引为4,对应父节点索引为2,父节点存储的值为30,插入值19≤30已经满足终止条件,但代码仍然执行了交换操作,将父节点的30和当前节点的19互换,最终导致父节点值19小于子节点值30,违反最大堆性质。
修复后的实现
这里改用更通用的0索引堆实现,不需要额外插入占位元素,同时规避原入参被修改的问题:
def insertinmaxheap(arryhp, num): # 复制原数组避免修改传入的参数 heap = arryhp.copy() heap.append(num) current_idx = len(heap) - 1 # 向上遍历调整堆结构 while current_idx > 0: parent_idx = (current_idx - 1) // 2 # 父节点值大于等于插入值,满足最大堆性质,终止调整 if heap[parent_idx] >= num: break # 交换父节点和当前节点的值 heap[current_idx] = heap[parent_idx] heap[parent_idx] = num current_idx = parent_idx return heap
调用测试用例insertinmaxheap([50, 30, 20, 15, 10, 8, 16], 19),输出结果为[50, 30, 20, 19, 10, 8, 16, 15],符合最大堆性质要求。
内容的提问来源于stack exchange,提问作者Mama africa
相关产品推荐
相关产品推荐

