{
  "slug": "heap-pop",
  "title": "Heap — Extract Max",
  "category": "Trees",
  "difficulty": "medium",
  "complexity": {
    "time": "O(log n)",
    "space": "O(1)"
  },
  "idea": "The maximum is always the root. To remove it, swap it with the last node, drop that last slot, then sift the new root down until the heap property holds again — about log n steps.",
  "code": [
    "max = root",
    "move the last node to the root",
    "shrink the heap by one",
    "siftDown(root) until parents outrank children"
  ],
  "example": {
    "array": [
      4,
      10,
      3,
      5,
      1,
      8,
      2
    ]
  },
  "invariant": "Each step is the real data structure at that step — the picture is a pure function of it.",
  "stepCount": 16,
  "steps": [
    {
      "i": 0,
      "op": "tree",
      "caption": "We start from a max-heap — the largest value is at the root.",
      "note": null,
      "codeLine": null,
      "stats": null,
      "nodes": [
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 1,
      "op": "tree",
      "caption": "The maximum is 10, at the root.",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "nodes": [
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "target",
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 2,
      "op": "tree",
      "caption": "Swap 10 with the last node so it can be removed cheaply.",
      "note": null,
      "codeLine": 2,
      "stats": null,
      "nodes": [
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "swap",
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h1",
          "value": 10,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": "swap",
          "badges": null
        }
      ]
    },
    {
      "i": 3,
      "op": "tree",
      "caption": "Remove 10 — the heap is one smaller.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "nodes": [
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 4,
      "op": "tree",
      "caption": "Compare 2 with its larger child 8.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "compare",
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "right",
          "focus": "compare",
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 5,
      "op": "tree",
      "caption": "Still out of order — sink it one more level.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "swap",
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": "swap",
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "left",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 6,
      "op": "tree",
      "caption": "Compare 2 with its larger child 3.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": "compare",
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "left",
          "focus": "compare",
          "badges": null
        }
      ]
    },
    {
      "i": 7,
      "op": "tree",
      "caption": "Still out of order — sink it one more level.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": "swap",
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h2",
          "side": "left",
          "focus": "swap",
          "badges": null
        }
      ]
    },
    {
      "i": 8,
      "op": "tree",
      "caption": "The maximum is 8, at the root.",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "nodes": [
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "target",
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h5",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h2",
          "side": "left",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 9,
      "op": "tree",
      "caption": "Swap 8 with the last node so it can be removed cheaply.",
      "note": null,
      "codeLine": 2,
      "stats": null,
      "nodes": [
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "swap",
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h5",
          "value": 8,
          "label": null,
          "text": null,
          "parent": "h2",
          "side": "left",
          "focus": "swap",
          "badges": null
        }
      ]
    },
    {
      "i": 10,
      "op": "tree",
      "caption": "Remove 8 — the heap is one smaller.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "nodes": [
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 11,
      "op": "tree",
      "caption": "Compare 2 with its larger child 5.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "compare",
          "badges": null
        },
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "left",
          "focus": "compare",
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 12,
      "op": "tree",
      "caption": "Still out of order — sink it one more level.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "swap",
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": "swap",
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 13,
      "op": "tree",
      "caption": "Compare 2 with its larger child 4.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": "compare",
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "left",
          "focus": "compare",
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h6",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 14,
      "op": "tree",
      "caption": "Still out of order — sink it one more level.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": "swap",
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "left",
          "focus": "swap",
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 15,
      "op": "tree",
      "caption": "Two maxima extracted, and the heap property still holds.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "h3",
          "value": 5,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "settled",
          "badges": null
        },
        {
          "id": "h0",
          "value": 4,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "left",
          "focus": "settled",
          "badges": null
        },
        {
          "id": "h2",
          "value": 3,
          "label": null,
          "text": null,
          "parent": "h3",
          "side": "right",
          "focus": "settled",
          "badges": null
        },
        {
          "id": "h6",
          "value": 2,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "left",
          "focus": "settled",
          "badges": null
        },
        {
          "id": "h4",
          "value": 1,
          "label": null,
          "text": null,
          "parent": "h0",
          "side": "right",
          "focus": "settled",
          "badges": null
        }
      ]
    }
  ]
}