AVL Trees and the Height-Balanced Alternative
What This Concept Is
AVL balance requires each node's child heights to differ by at most one. The lab uses empty height 0 and leaf height 1, stores exact height and subtree size, and supports a complete map API including deletion and rank/select. The two metadata fields serve different purposes: height guides rotations; size answers order-statistic queries.
Why It Matters Here
The invariant is simple enough to check recursively yet strong enough to force logarithmic height. Deletion and metadata repair make this a more demanding exercise than an insertion-only demonstration.
Concrete Examples
Let N(h) be the minimum number of nodes in an AVL tree of height h.
N(0)=0, N(1)=1, and N(h)=1+N(h-1)+N(h-2). A minimally populated
height-h node needs one child of height h-1 and another of at least h-2.
This Fibonacci-like growth implies h=O(log(n+1)); it is not a measurement
of wall-clock lookup speed.
For insertion [3,1,2], root 3 becomes left-heavy but child 1 is right-heavy.
Rotate left at 1, then right at 3, obtaining root 2 with children 1,3.
Refresh the lower nodes before their new parent. Left-left, right-right and
right-left are the other three orientations.
On deletion, a subtree's height can fall and trigger rebalancing repeatedly upward; repairing only the first imbalance is insufficient in general. If the heavy child's two subtree heights tie, a single rotation is appropriate in the usual deletion fixup. Treating equality as the double-rotation case can break balance or do unnecessary work. Test deletion sequences, not only insertion permutations.
For order statistics, size(node)=1+size(left)+size(right). To select index k,
compare k with left size; descending right subtracts left size plus one.
For rank(x), add that same quantity whenever the search passes a smaller node
and proceeds right. Both walk O(log n) nodes when metadata and AVL balance hold.
Common Confusion / Misconceptions
A tighter theoretical height bound does not establish a universal speed advantage over red-black trees. Allocation, locality, comparison costs and operation mix matter. One single-or-double rebalance after insertion is not a claim that every deletion needs only one. Balanced shape with stale sizes still gives wrong rank/select.
How To Use It
Validate exact heights, balance, sizes, global key bounds and unique node identity after every mutation. Compare public behavior to sorted dictionary items. Include all four rotations, replacements, root deletion and a two-child deletion with a successor payload. Analyze lookup/update path length separately from O(n) traversal output.
Check Yourself
Why must size be recomputed even if height stays unchanged? How does the minimum-node recurrence prove logarithmic height? Why can deletion repair propagate?
Mini Drill or Application
For root 2 with leaves 1 and 3, delete 1 and then replace key 3. Feedback: two nodes remain after deletion; replacement preserves that count. Select index 1 must return key 3 and its new value.
Read This Only If Stuck
CLRS and Skiena: balanced-tree invariants and rotations. The lab specifies AVL conventions directly, so no particular edition must supply identical code.