A plain BST can degenerate. Self-balancing trees restructure themselves on insert/delete to maintain height. The variants differ in the precise balance invariant and the cost of restructuring.
AVL trees
Maintain: every node's two subtrees differ in height by at most 1. After an insert or delete, walk back up from the leaf and rotate (single or double rotation) wherever the invariant breaks. AVL gives tight height — slightly shorter than red-black, so reads are faster, but writes are more expensive.
Red-black trees
Maintain a coloring invariant: every node is red or black, and every root-to-leaf path has the same number of black nodes (plus a few constraints on red nodes). This is looser than AVL — height is at most . Insert/delete cost is comparable to AVL but with simpler rotation logic, and it's what most production libraries use (Java TreeMap, C++ std::map, Linux's CFS scheduler).
Splay trees
Move the most recently accessed node to the root via a sequence of rotations. Operations are amortized — worst case can be but rare. Splay trees adapt to access patterns and are useful when some keys are much hotter than others.
B-trees and B+ trees
Generalize BSTs to higher fanout — each internal node has many children (often hundreds in practice). Designed for disk-based storage where reading a page is expensive but the page itself is large. B+ trees (a variant where all data lives in leaves linked together) back nearly every relational database's primary index.
What an interviewer expects
You don't need to implement AVL rotations on a whiteboard. You should know: (1) the problem they solve, (2) the height guarantee, (3) which language libraries use them, and (4) when a hash map is a better choice anyway.