Fundamentals of OOP and Data Structures in Java: Trees, Heaps, and Priority Queues