Java Structures: Data Structures in Java for the Principled Programmer