我的maxHeapify逻辑是否正确?嵌套右子节点检查的实现是否合理
关于maxHeapify实现逻辑的正确性确认
我看到不同书籍和文章里的maxHeapify实现方式不一样,想确认自己这种把右子节点检查嵌套在左子节点检查里的写法是否正确,而且我觉得嵌套写法更高效。
原因很简单:堆的结构决定了,如果一个节点没有左子节点,那它肯定也没有右子节点。所以第一个if语句先检查左子节点是否存在,要是不存在直接返回——当前节点是叶节点,本身已经符合堆的要求了。
如果存在左子节点,就进入if块:
- 先初始化
largest为当前节点索引i - 比较当前节点和左子节点的值,把较大值的索引赋值给
largest - 接着检查右子节点是否存在,要是存在就把它和当前
largest指向的节点比较,更新largest为更大值的索引 - 最后如果
largest不等于i,说明当前节点不是最大值,交换两者位置,再递归调用maxHeapify(largest)
这个递归的基例有三种情况:
- 无左子节点,当前节点是叶节点
- 存在左子节点、无右子节点,且左子节点的值不大于当前节点
- 左右子节点都存在,但两者的值都不大于当前节点
我认为这些基例的逻辑都依赖左子节点的存在,所以把右子节点检查嵌套在左子节点检查里完全可行,以下是我的实现代码:
void maxHeapify(int i) { if (leftChild(i) < size()) // 当前节点有左子节点,说明不是叶节点 { int largest = i; if (heap[leftChild(i)] > heap[largest]) { largest = leftChild(i); } if (rightChild(i) < size()) { if (heap[rightChild(i)] > heap[largest]) { largest = rightChild(i); } } if (largest != i) { swap(i, largest); maxHeapify(largest); } } }
内容的提问来源于stack exchange,提问作者Game Development
相关产品推荐
相关产品推荐

