A splay tree is a binary search tree with one twist: every accessed node is splayed to the root by a sequence of rotations. There's no colour, height, or rank stored on the nodes — the amortized O(log n) comes entirely from the access pattern. Insert some keys, then find or delete one and watch the zig / zig-zig / zig-zag chain unwind.
Every operation — insert, find, delete — ends with a splay of the target node x. Working up from x, the algorithm applies one of three cases per pass:
x's parent p is the root: rotate x up one level and stop.x and p are both left children (or both right): rotate p first, then x. This "double" case is what gives splay trees their good amortized bound.x is a right child of a left-child parent (or the mirror): rotate x twice, once around p, then around p's parent.
Because every access moves the touched node to the root, splay trees exhibit strong working-set locality: recently or frequently accessed items are near the root and cost O(1) to reach. Sleator and Tarjan proved they're within a constant factor of any BST for any access sequence — the famous dynamic optimality conjecture. Real users include the Linux kernel's lib/klist.c, GNU libavl, and some database B-tree page caches.