{
  "slug": "bst-insert",
  "title": "BST — Insert",
  "category": "Trees",
  "difficulty": "easy",
  "complexity": {
    "time": "O(h)",
    "space": "O(1)"
  },
  "idea": "A binary search tree keeps everything smaller than a node in its left subtree and everything larger in its right. Inserting means walking down that rule until you fall off the tree, then hanging the new node there.",
  "code": [
    "if tree is empty: new node becomes the root",
    "cur = root",
    "while true:",
    "    if key < cur: go left  (empty? attach here)",
    "    else:         go right (empty? attach here)"
  ],
  "example": {
    "array": [
      50,
      30,
      70,
      20,
      45,
      60,
      85
    ]
  },
  "invariant": "Each step is the real data structure at that step — the picture is a pure function of it.",
  "stepCount": 19,
  "steps": [
    {
      "i": 0,
      "op": "tree",
      "caption": "Build a binary search tree: smaller keys go left, larger go right.",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "nodes": []
    },
    {
      "i": 1,
      "op": "tree",
      "caption": "50 is the first key — it becomes the root.",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "insert",
          "badges": null
        }
      ]
    },
    {
      "i": 2,
      "op": "tree",
      "caption": "Compare 30 with 50.",
      "note": "smaller → go left",
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "compare",
          "badges": [
            "cur"
          ]
        }
      ]
    },
    {
      "i": 3,
      "op": "tree",
      "caption": "Nothing to the left of 50 — hang 30 there.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": "insert",
          "badges": null
        }
      ]
    },
    {
      "i": 4,
      "op": "tree",
      "caption": "Compare 70 with 50.",
      "note": "larger → go right",
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "compare",
          "badges": [
            "cur"
          ]
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 5,
      "op": "tree",
      "caption": "Nothing to the right of 50 — hang 70 there.",
      "note": null,
      "codeLine": 5,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": "insert",
          "badges": null
        }
      ]
    },
    {
      "i": 6,
      "op": "tree",
      "caption": "Compare 20 with 50.",
      "note": "smaller → go left",
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "compare",
          "badges": [
            "cur"
          ]
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 7,
      "op": "tree",
      "caption": "Compare 20 with 30.",
      "note": "smaller → go left",
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": "compare",
          "badges": [
            "cur"
          ]
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 8,
      "op": "tree",
      "caption": "Nothing to the left of 30 — hang 20 there.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t3",
          "value": 20,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "left",
          "focus": "insert",
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 9,
      "op": "tree",
      "caption": "Compare 45 with 50.",
      "note": "smaller → go left",
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "compare",
          "badges": [
            "cur"
          ]
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t3",
          "value": 20,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 10,
      "op": "tree",
      "caption": "Compare 45 with 30.",
      "note": "larger → go right",
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": "compare",
          "badges": [
            "cur"
          ]
        },
        {
          "id": "t3",
          "value": 20,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 11,
      "op": "tree",
      "caption": "Nothing to the right of 30 — hang 45 there.",
      "note": null,
      "codeLine": 5,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t3",
          "value": 20,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t4",
          "value": 45,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "right",
          "focus": "insert",
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 12,
      "op": "tree",
      "caption": "Compare 60 with 50.",
      "note": "larger → go right",
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "compare",
          "badges": [
            "cur"
          ]
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t3",
          "value": 20,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t4",
          "value": 45,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 13,
      "op": "tree",
      "caption": "Compare 60 with 70.",
      "note": "smaller → go left",
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t3",
          "value": 20,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t4",
          "value": 45,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": "compare",
          "badges": [
            "cur"
          ]
        }
      ]
    },
    {
      "i": 14,
      "op": "tree",
      "caption": "Nothing to the left of 70 — hang 60 there.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t3",
          "value": 20,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t4",
          "value": 45,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "t5",
          "value": 60,
          "label": null,
          "text": null,
          "parent": "t2",
          "side": "left",
          "focus": "insert",
          "badges": null
        }
      ]
    },
    {
      "i": 15,
      "op": "tree",
      "caption": "Compare 85 with 50.",
      "note": "larger → go right",
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": "compare",
          "badges": [
            "cur"
          ]
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t3",
          "value": 20,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t4",
          "value": 45,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "t5",
          "value": 60,
          "label": null,
          "text": null,
          "parent": "t2",
          "side": "left",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 16,
      "op": "tree",
      "caption": "Compare 85 with 70.",
      "note": "larger → go right",
      "codeLine": 4,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t3",
          "value": 20,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t4",
          "value": 45,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": "compare",
          "badges": [
            "cur"
          ]
        },
        {
          "id": "t5",
          "value": 60,
          "label": null,
          "text": null,
          "parent": "t2",
          "side": "left",
          "focus": null,
          "badges": null
        }
      ]
    },
    {
      "i": 17,
      "op": "tree",
      "caption": "Nothing to the right of 70 — hang 85 there.",
      "note": null,
      "codeLine": 5,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t3",
          "value": 20,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t4",
          "value": 45,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "t5",
          "value": 60,
          "label": null,
          "text": null,
          "parent": "t2",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t6",
          "value": 85,
          "label": null,
          "text": null,
          "parent": "t2",
          "side": "right",
          "focus": "insert",
          "badges": null
        }
      ]
    },
    {
      "i": 18,
      "op": "tree",
      "caption": "Every key placed. Reading this tree in-order gives them sorted.",
      "note": null,
      "codeLine": 5,
      "stats": null,
      "nodes": [
        {
          "id": "t0",
          "value": 50,
          "label": null,
          "text": null,
          "parent": null,
          "side": null,
          "focus": null,
          "badges": null
        },
        {
          "id": "t1",
          "value": 30,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t3",
          "value": 20,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t4",
          "value": 45,
          "label": null,
          "text": null,
          "parent": "t1",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "t2",
          "value": 70,
          "label": null,
          "text": null,
          "parent": "t0",
          "side": "right",
          "focus": null,
          "badges": null
        },
        {
          "id": "t5",
          "value": 60,
          "label": null,
          "text": null,
          "parent": "t2",
          "side": "left",
          "focus": null,
          "badges": null
        },
        {
          "id": "t6",
          "value": 85,
          "label": null,
          "text": null,
          "parent": "t2",
          "side": "right",
          "focus": null,
          "badges": null
        }
      ]
    }
  ]
}