Splay trees are self-balancing binary search trees that provide fast access both in worst-case amortized time (O(log n)) and in practice due to their locality properties. When a node is accessed, it is rotated to the root through a series of zig-zag and zig-zig rotations, improving locality for future accesses. This helps frequently accessed nodes rise to the top of the tree over time. Splay trees also support efficient split and join operations through splaying, which makes them useful for tasks like range queries and dictionary operations.