Table of Contents Welcome Data Types and Memory Ones and Zeros Binary Numbers Booleans Memory and Pointers Collections Abstract Data Types Arrays Stacks and Queues Exercises: ADTs and Collections Exercises: Using Collections Data Structures Box-and-Pointer Diagrams The 'Array-List' Data Structure The 'Linked List' Data Structure The 'Hash Map' Data Structure Exercises: Box-and-Pointer Diagrams Exercises: List Data Structures Trees Trees Six Ways to Think About Trees Tree Data Structures Exercises: Trees Exercises: Tree Data Structures Graphs Graphs Graph Problems Graph Data Structures Exercises: Graph Data Structures Recursion Recursion on Trees Recursion on Linked Lists Three Ways to Think About Recursion Problem-Solving Specifying Problems A Problem-Solving Process Algorithmic "Plans" Exercises: Recognising "Plans" Exercises: Problem-Solving with "Plans" Searching Search Algorithms Depth-First Search Breadth-First Search Exercises: Searching Lists Exercises: Searching Trees Sorting Comparisons and Swaps Iterative Sorting Recursive Sorting Exercises: Sorting Algorithm Design Algorithm Strategies Choose the Right Data Types Exercises: Algorithm Design Geometric Data Points and Vectors Simple Shapes Polygons Exercises: Geometry Algorithm Efficiency How Fast is Your Algorithm? Static Analysis Big-O Notation Choose the Right Data Structures Exercises: Algorithm Efficiency Algorithm Correctness Is Your Algorithm Correct? Invariants Variants Exercises: Algorithm Correctness