Data Structures and Abstractions with Java (2nd Edition)