To really understand data structures and algorithmic complexity, you need to understand discrete math. This the best starting point for CS theory. I love discrete math, others may find it very boring.
- Essentials of Discrete Mathematics (Hunter)
I can't think of a good data structures reading off the top of my head unfortunately. Often the trick to an efficient algorithm is really just an efficient data structure. Check out Dijkstra's algorithm for a great example of this (BFS + min-heap/priority queue).