ЁЯПл The SchoolтА║ЁЯзо DSAтА║ЁЯМ│ рдзрдбрд╛ 09 тАФ Trees рдЖрдгрд┐ heaps: рдХреЕрдЯрд▓реЙрдЧрдЪрд╛ рдЦрдг рдЖрдгрд┐ рд╡реНрдпрд╛рд╕рдкреАрда
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯМ│ рдзрдбрд╛ 09 тАФ Trees рдЖрдгрд┐ heaps: рдХреЕрдЯрд▓реЙрдЧрдЪрд╛ рдЦрдг рдЖрдгрд┐ рд╡реНрдпрд╛рд╕рдкреАрда

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдкреБрдвреЗ: lesson-10-graphs


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ09. structure рд░реВрдкрд╛рддрд▓рд╛ binary search, рддреНрдпрд╛рд▓рд╛ balance рдХрд╛ рд▓рд╛рдЧрддреЛ, tree рдордзреВрди рдЪрд╛рд▓рдгреНрдпрд╛рдЪреНрдпрд╛ рддреАрди рдкрджреНрдзрддреА, рдЖрдгрд┐ рд╡рд░ рдХреЛрдг рдЖрд╣реЗ рд╣реЗ рдиреЗрд╣рдореА рдорд╛рд╣реАрдд рдЕрд╕рдгрд╛рд░рд╛ structure.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдЪрд╛ рдХреЕрдЯрд▓реЙрдЧрдЪрд╛ рдЦрдг: рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рд╕рд╛рдВрдЧрддреЗ "рд▓рд╣рд╛рди рдХрд╛рд░реНрдбреЗ рдорд╛рдЭреНрдпрд╛ рдбрд╛рд╡реАрдХрдбреЗ, рдореЛрдареА рдЙрдЬрд╡реАрдХрдбреЗ". рдХрд╛рд░реНрдб рд╢реЛрдзрдгреЗ рд╣рд╛ рдкреБрдиреНрд╣рд╛ binary search рдЪ тАФ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдбрд╛рдЬрд╡рд│ рдЦрдгрд╛рдЪрд╛ рдЕрд░реНрдзрд╛ рднрд╛рдЧ рд╕реЛрдбрд╛. рдбрд╛рд╡реЗ-рдореА-рдЙрдЬрд╡реЗ рдЕрд╕реЗ рдЪрд╛рд▓рд▓рд╛рдд рддрд░ рдХрд╛рд░реНрдбреЗ рдЖрдкреЛрдЖрдк sorted рдмрд╛рд╣реЗрд░ рдпреЗрддрд╛рдд. рдкрдг рдХрд╛рд░реНрдбреЗ sorted рдХреНрд░рдорд╛рдиреЗ рд▓рд╛рд╡рд▓реА рддрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рдЖрдзреАрдЪреНрдпрд╛рдЪреНрдпрд╛ рдЙрдЬрд╡реАрдХрдбреЗ рдЬрд╛рддреЗ: рдЦрдг рдПрдХ рд▓рд╛рдВрдмрд▓рдЪрдХ рд╕рд╛рдЦрд│реА рдмрдирддреЛ тАФ рд╡реЗрд╖рд╛рдВрддрд░ рдХреЗрд▓реЗрд▓реА list, O(n). Balanced trees рдЦрдг рдЫреЛрдЯрд╛ рдареЗрд╡рд╛рдпрд▓рд╛ рдХрд╛рд░реНрдбреЗ рдлрд┐рд░рд╡рддрд╛рдд (rotate).

рдХреНрд░реАрдбрд╛ рджрд┐рдирд╛рдЪреЗ рд╡реНрдпрд╛рд╕рдкреАрда: рд╕рд░реНрд╡рд╛рдд рдЬрд▓рдж рдзрд╛рд╡рдкрдЯреВ рдиреЗрд╣рдореА рд╡рд░ рдЕрд╕рддреЗ. рдирд╡реА рд╡реЗрд│ рдЖрд▓реА? рддреА рддрд│рд╛рд╢реА рдареЗрд╡рд╛ рдЖрдгрд┐ рд╣рд│реВ рд╡реЗрд│рд╛рдВрдирд╛ рдУрд▓рд╛рдВрдбреВрди рд╡рд░ рдЪрдвреВ рджреНрдпрд╛. рд╡рд░рдЪреА рдХрд╛рдврд╛рдпрдЪреА? рд╢реЗрд╡рдЯрдЪреА рд╡рд░ рдЖрдгрд╛ рдЖрдгрд┐ рддрд┐рд▓рд╛ рдЦрд╛рд▓реА рдмреБрдбреВ рджреНрдпрд╛. рдкреНрд░рддреНрдпреЗрдХ рджреБрд░реБрд╕реНрддреА рдореНрд╣рдгрдЬреЗ рдХрд╛рд╣реА рдЕрджрд▓рд╛рдмрджрд▓реА тАФ O(log n) тАФ рдЖрдгрд┐ рддреБрдореНрд╣реА рдХрдзреАрдЪ рдкреВрд░реНрдг list sort рдХрд░рдд рдирд╛рд╣реА.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart TD
  R["50"] --> A["25"] & B["75"]
  A --> A1["12"] & A2["37"]
  B --> B1["62"] & B2["87"]
  A1 --> A11["6"] & A12["18"]

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдмрджрд▓рдд рдЕрд╕рддрд╛рдирд╛рд╣реА sorted data sorted рд░рд╛рд╣рддреЛ рддреЛ trees рдореБрд│реЗ; рдкреБрдиреНрд╣рд╛ sort рди рдХрд░рддрд╛ рд╡рд╛рд░рдВрд╡рд╛рд░ minimum рдорд┐рд│рддреЛ рддреЛ heaps рдореБрд│реЗ. рджреЛрдШреЗ рдорд┐рд│реВрди database indexes, schedulers, рдЖрдгрд┐ рдЕрдВрддрд░ рдореЛрдЬрдгрд╛рд▒реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ graph algorithm рдордзрд▓реА priority queue рд╕рдордЬрд╛рд╡рддрд╛рдд.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

BST.search рдХрд┐рддреА рдХрд╛рд░реНрдбреЗ рдкрд╛рд╣рд┐рд▓реА рддреА рд╕рдВрдЦреНрдпрд╛ рдкрд░рдд рдХрд░рддреЛ; demo.py trees рддреНрдпрд╛рдЪ 11 keys balanced рдХреНрд░рдорд╛рдиреЗ (height 4) рдЖрдгрд┐ sorted рдХреНрд░рдорд╛рдиреЗ (height 11) insert рдХрд░рддреЛ. MinHeap рд╣рд╛ array рдЖрд╣реЗ, рдЬреНрдпрд╛рдд push/pop index рдЧрдгрд┐рддрд╛рдиреЗ sifts рдХрд░рддрд╛рдд.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 dsa/demo.py trees
python3 - <<'EOF'
import sys, heapq, random; sys.path.insert(0, "dsa"); from structures import BST, MinHeap
t = BST(); [t.insert(k) for k in random.Random(4).sample(range(1000), 500)]
print("500 random keys тЖТ height", t.height(), "(log2 500 тЙИ 9; a random tree runs about twice that)")
print("in-order first 5:", t.inorder()[:5])
times = [12.9, 11.4, 13.7, 10.8, 12.1]
print("top 3 with heapq.nsmallest:", heapq.nsmallest(3, times))     # O(n log k) тАФ no full sort
EOF

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

Balanced рдХреНрд░рдо: height 4, search(43) 4 рдХрд╛рд░реНрдбреЗ рдкрд╛рд╣рддреЛ; sorted рдХреНрд░рдо: height 11, 11 рдХрд╛рд░реНрдбреЗ; heap 10.8, 11.4, 12.1 pop рдХрд░рддреЛ. рддреБрдордЪреНрдпрд╛ random tree рдЪреА height 18 рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪреА in-order рдЪрд╛рд▓ sorted рдЖрд╣реЗ; nsmallest рддреНрдпрд╛рдЪ рддреАрди рд╡реЗрд│рд╛ рджреЗрддреЛ.

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

BST рдореНрд╣рдгрдЬреЗ рдЬреНрдпрд╛рдд insert рдХрд░рддрд╛ рдпреЗрддреЛ рдЕрд╕рд╛ binary search, balance рдореБрд│реЗрдЪ рддреЛ O(log n) рд░рд╛рд╣рддреЛ, рдЖрдгрд┐ heap sorting рд╢рд┐рд╡рд╛рдп O(log n) рдордзреНрдпреЗ minimum рджреЗрддреЛ.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдкреНрд░рддреНрдпреЗрдХ CREATE INDEX рдореНрд╣рдгрдЬреЗ B-tree; рдкреНрд░рддреНрдпреЗрдХ scheduler рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ "рдкреБрдврдЪрд╛ event" loop рдореНрд╣рдгрдЬреЗ heap; рдкреНрд░рддреНрдпреЗрдХ JSON document рдореНрд╣рдгрдЬреЗ рддреБрдореНрд╣реА recursively рдЪрд╛рд▓рддрд╛ рдЕрд╕реЗ tree.

тПня╕П рдкреБрдвреЗ

рдзрдбрд╛ 10 тАФ graphs: рдХреЙрд░рд┐рдбреЙрд░рдЪрд╛ рдирдХрд╛рд╢рд╛, рдЖрдгрд┐ рддреНрдпрд╛рддреВрди рдЪрд╛рд▓рдгреНрдпрд╛рдЪреНрдпрд╛ рддреАрди рдкрджреНрдзрддреА.

ЁЯМ│ Lesson 09 тАФ Trees & heaps: the catalogue drawer and the podium

ЁЯУН You are here: Lesson 09 of 12 ┬╖ Next: lesson-10-graphs


ЁЯУж What's in this branch

Lessons 01тАУ09. Binary search as a structure, why it needs balance, three ways to walk a tree, and the structure that always knows who is on top.

ЁЯзТ Explain like I'm 5

The library's catalogue drawer: every card says "smaller cards are on my left, bigger on my right". Finding a card is binary search again тАФ halve the drawer at each card. Walk it left-me-right and the cards come out sorted for free. But file cards in sorted order and every card is to the right of the last: the drawer becomes one long chain тАФ a list in disguise, O(n). Balanced trees rotate cards to keep the drawer short.

The podium at sports day: the fastest runner is always on top. A new time arrives? Put it at the bottom and let it climb past slower times. Take the top? Move the last one up and let it sink. Each fix is a few swaps тАФ O(log n) тАФ and you never sort the whole list.

ЁЯЧ║я╕П Diagram

flowchart TD
  R["50"] --> A["25"] & B["75"]
  A --> A1["12"] & A2["37"]
  B --> B1["62"] & B2["87"]
  A1 --> A11["6"] & A12["18"]

тЭУ What

ЁЯдФ Why

Trees are how sorted data stays sorted while changing; heaps are how you get the minimum repeatedly without re-sorting. Between them they explain database indexes, schedulers, and the priority queue in every graph algorithm that measures distance.

ЁЯФз How (in this repo)

BST.search returns the number of cards looked at; demo.py trees inserts the same 11 keys in a balanced order (height 4) and in sorted order (height 11). MinHeap is an array with push/pop doing the sifts by index arithmetic.

ЁЯзк Try it

python3 dsa/demo.py trees
python3 - <<'EOF'
import sys, heapq, random; sys.path.insert(0, "dsa"); from structures import BST, MinHeap
t = BST(); [t.insert(k) for k in random.Random(4).sample(range(1000), 500)]
print("500 random keys тЖТ height", t.height(), "(log2 500 тЙИ 9; a random tree runs about twice that)")
print("in-order first 5:", t.inorder()[:5])
times = [12.9, 11.4, 13.7, 10.8, 12.1]
print("top 3 with heapq.nsmallest:", heapq.nsmallest(3, times))     # O(n log k) тАФ no full sort
EOF

тЬЕ Verify тАФ what you should see

Balanced order: height 4, search(43) looks at 4 cards; sorted order: height 11, 11 cards; the heap pops 10.8, 11.4, 12.1. Your random tree is height 18 and its in-order walk is sorted; nsmallest gives the same three times.

ЁЯПБ What you just proved

A BST is binary search you can insert into, balance is what keeps it O(log n), and a heap gives you the minimum in O(log n) without sorting.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: every CREATE INDEX is a B-tree; every scheduler and every "next event" loop is a heap; every JSON document is a tree you walk recursively.

тПня╕П Next

Lesson 10 тАФ graphs: the corridor map, and three ways to walk it.

тЖР Previousbinary searchNext тЖТgraphs

This page is the lesson's README from the lesson-09-trees-heaps branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.