🐵指尖猴全新升级
第9课:堆的插入与删除
🔄

堆的插入与删除

上浮下沉,秩序井然,离信奥更近一步!

📖知识引入

⬆️插入与上浮
新元素先放到数组末尾,和父亲比大小,该升就一路换上去
⬇️删除与下沉
堆顶出堆后末尾元素补位,和较大的孩子比较往下沉
⏱️O(log n)
上浮下沉最多走一条从底到顶的路径,步数就是树高
⚠️边界提醒
下沉前先判断孩子是否存在,别和空气交换
💡
删除堆顶用最后一个元素补位而不是直接删,是为了保住完全二叉树的形状

🔍手写push与pop

void push(int v) {          // 插入:放末尾,向上浮
    heap[++n] = v;
    int i = n;
    while (i > 1 && heap[i] > heap[i / 2]) {  // 大根堆
        swap(heap[i], heap[i / 2]);
        i /= 2;
    }
}

void pop() {                // 删除堆顶:末尾补位,向下沉
    heap[1] = heap[n--];
    int i = 1;
    while (2 * i <= n) {
        int son = 2 * i;    // 先选左孩子
        if (son + 1 <= n && heap[son + 1] > heap[son]) son++;  // 换更大的
        if (heap[i] >= heap[son]) break;
        swap(heap[i], heap[son]);
        i = son;
    }
}

插入往上浮、删除往下沉,一套代码撑起整个堆。

🎯小测验

第1题:堆插入新元素时先放在哪里?

第2题:大根堆下沉时要和哪个孩子交换?

第3题:堆插入和删除的时间复杂度是?

📝本课知识点

  • ✓插入=末尾上浮
  • ✓删除=堆顶下沉
  • ✓两者都是O(log n)
第9课完成!继续探索下一课吧 🚀