Back patching is a technique used to solve the problem of replacing symbolic names in goto statements with actual target addresses during compilation. It involves maintaining a list of branches that target the same labels and replacing the labels once they are defined. Three address code represents program statements using three operands, where each statement performs one operation and stores the result in a temporary variable or location. The various data structures used for implementing symbol tables include linear lists, binary trees, and hash tables.