100% found this document useful (5 votes)
18 views

Data Structures & Algorithms in Python 1st Edition John Canning - eBook PDF all chapter instant download

Ebookluna.com offers seamless downloads of ebooks across various genres, including titles on data structures and algorithms in Python and C++. The site provides instant digital products in multiple formats such as PDF, ePub, and MOBI. Users can explore and download a wide range of educational resources related to programming and data structures.

Uploaded by

sllomduriko
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (5 votes)
18 views

Data Structures & Algorithms in Python 1st Edition John Canning - eBook PDF all chapter instant download

Ebookluna.com offers seamless downloads of ebooks across various genres, including titles on data structures and algorithms in Python and C++. The site provides instant digital products in multiple formats such as PDF, ePub, and MOBI. Users can explore and download a wide range of educational resources related to programming and data structures.

Uploaded by

sllomduriko
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 66

Experience Seamless Full Ebook Downloads for Every Genre at ebookluna.

com

Data Structures & Algorithms in Python 1st Edition


John Canning - eBook PDF

https://ebookluna.com/download/data-structures-algorithms-
in-python-ebook-pdf-2/

OR CLICK BUTTON

DOWNLOAD NOW

Explore and download more ebook at https://ebookluna.com


Instant digital products (PDF, ePub, MOBI) available
Download now and explore formats that suit you...

Data Structures & Algorithms in Python 1st Edition John


Canning - eBook PDF

https://ebookluna.com/download/data-structures-algorithms-in-python-
ebook-pdf/

ebookluna.com

Fundamentals Of Python: Data Structures 2nd Edition


Kenneth A. Lambert - eBook PDF

https://ebookluna.com/download/fundamentals-of-python-data-structures-
ebook-pdf/

ebookluna.com

Data Structures - eBook PDF

https://ebookluna.com/download/data-structures-ebook-pdf/

ebookluna.com

(eBook PDF) Data Structures & Algorithm Analysis in C++


4th Edition

https://ebookluna.com/product/ebook-pdf-data-structures-algorithm-
analysis-in-c-4th-edition/

ebookluna.com
Data Structures & Algorithm Analysis in C++ 4th Edition
(eBook PDF)

https://ebookluna.com/product/data-structures-algorithm-analysis-
in-c-4th-edition-ebook-pdf/

ebookluna.com

Introduction to Algorithms for Data Mining and Machine


Learning 1st edition - eBook PDF

https://ebookluna.com/download/introduction-to-algorithms-for-data-
mining-and-machine-learning-ebook-pdf/

ebookluna.com

Machine Learning for Biometrics: Concepts, Algorithms and


Applications (Cognitive Data Science in Sustainable
Computing) 1st Edition - eBook PDF
https://ebookluna.com/download/machine-learning-for-biometrics-
concepts-algorithms-and-applications-cognitive-data-science-in-
sustainable-computing-ebook-pdf/
ebookluna.com

Data Structures and Applications: A Simple and Systematic


Approach 1st edition - eBook PDF

https://ebookluna.com/download/data-structures-and-applications-a-
simple-and-systematic-approach-ebook-pdf/

ebookluna.com

(eBook PDF) Starting Out with Java: From Control


Structures through Data Structures 3rd Edition

https://ebookluna.com/product/ebook-pdf-starting-out-with-java-from-
control-structures-through-data-structures-3rd-edition/

ebookluna.com
John Canning
Alan Broder
Robert Lafore

Data
Structures &
Algorithms
in Python

Boston • Columbus • New York • San Francisco • Amsterdam • Cape Town


Dubai • London • Madrid • Milan • Munich • Paris • Montreal • Toronto • Delhi • Mexico City
São Paulo • Sydney • Hong Kong • Seoul • Singapore • Taipei • Tokyo

9780134855684.indb 1 05/08/22 1:54 PM


Many of the designations used by manufacturers and sellers to distinguish their Editor-in-Chief
products are claimed as trademarks. Where those designations appear in this book, and Mark Taub
the publisher was aware of a trademark claim, the designations have been printed with
initial capital letters or in all capitals. Director, ITP Product
The authors and publisher have taken care in the preparation of this book, but make Management
no expressed or implied warranty of any kind and assume no responsibility for errors or Brett Bartow
omissions. No liability is assumed for incidental or consequential damages in connec-
tion with or arising out of the use of the information or programs contained herein. Acquisitions Editor
For information about buying this title in bulk quantities, or for special sales opportuni- Kim Spenceley
ties (which may include electronic versions; custom cover designs; and content particu-
Development Editor
lar to your business, training goals, marketing focus, or branding interests), please
contact our corporate sales department at corpsales@pearsoned.com or Chris Zahn
(800) 382-3419.
Managing Editor
For government sales inquiries, please contact governmentsales@pearsoned.com. Sandra Schroeder
For questions about sales outside the U.S., please contact intlcs@pearson.com.
Project Editor
Visit us on the Web: informit.com/aw
Mandie Frank
Library of Congress Control Number: 2022910068
Copyright © 2023 Pearson Education, Inc. Copy Editor
All rights reserved. This publication is protected by copyright, and permission must be Chuck Hutchinson
obtained from the publisher prior to any prohibited reproduction, storage in a retrieval
Indexer
system, or transmission in any form or by any means, electronic, mechanical, photo-
copying, recording, or likewise. For information regarding permissions, request forms, Cheryl Lenser
and the appropriate contacts within the Pearson Education Global Rights & Permissions
Proofreader
Department, please visit www.pearson.com/permissions.
Barbara Mack
No patent liability is assumed with respect to the use of the information contained
herein. Although every precaution has been taken in the preparation of this book, the Editorial Assistant
publisher and author assume no responsibility for errors or omissions. Nor is any liability Cindy Teeters
assumed for damages resulting from the use of the information contained herein.
ISBN-13: 978-0-13-485568-4 Designer
ISBN-10: 0-13-485568-X Chuti Prasertsith
ScoutAutomatedPrintCode Compositor
codeMantra

9780134855684.indb 2 05/08/22 1:54 PM


Contents at a Glance

1 Overview. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2 Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3 Simple Sorting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4 Stacks and Queues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5 Linked Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
6 Recursion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
7 Advanced Sorting.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
8 Binary Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
9 2-3-4 Trees and External Storage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
10 AVL and Red-Black Trees.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
11 Hash Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
12 Spatial Data Structures.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
13 Heaps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
14 Graphs.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
15 Weighted Graphs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
16 What to Use and Why.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813

Appendixes
A Running the Visualizations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
B Further Reading. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 841
C Answers to Questions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845

Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859

9780134855684.indb 3 05/08/22 1:54 PM


Table of Contents

1 Overview 1
What Are Data Structures and Algorithms?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Overview of Data Structures.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Overview of Algorithms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Some Definitions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Record. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Field. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Key. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Databases vs. Data Structures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Programming in Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Interpreter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Dynamic Typing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Sequences. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Looping and Iteration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Multivalued Assignment.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Importing Modules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Functions and Subroutines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
List Comprehensions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Exceptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Object-Oriented Programming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2 Arrays 29
The Array Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Searching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
The Duplicates Issue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Using Python Lists to Implement the Array Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Creating an Array. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Accessing List Elements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
A Better Array Class Implementation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
The OrderedArray Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Linear Search. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Binary Search. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

9780134855684.indb 4 05/08/22 1:54 PM


Python Code for an OrderedArray Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Binary Search with the find() Method.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
The OrderedArray Class.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Advantages of Ordered Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Logarithms.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
The Equation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
The Opposite of Raising 2 to a Power. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Storing Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
The OrderedRecordArray Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Big O Notation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Insertion in an Unordered Array: Constant. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Linear Search: Proportional to N. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Binary Search: Proportional to log(N). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Don’t Need the Constant. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Why Not Use Arrays for Everything?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

3 Simple Sorting 75
How Would You Do It?.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Bubble Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Bubble Sort on the Football Players. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
The SimpleSorting Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Python Code for a Bubble Sort.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Invariants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Efficiency of the Bubble Sort.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Selection Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Selection Sort on the Football Players. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
A Brief Description. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
A More Detailed Description.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
The Selection Sort in the SimpleSorting Visualization Tool. . . . . . . . . . . . . 85
Python Code for Selection Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Invariant. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Efficiency of the Selection Sort.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Insertion Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Insertion Sort on the Football Players. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Partial Sorting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
The Marked Player. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
The Insertion Sort in the SimpleSorting Visualization Tool. . . . . . . . . . . . . 89
Python Code for Insertion Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

9780134855684.indb 5 05/08/22 1:54 PM


vi Data Structures & Algorithms in Python

Invariants in the Insertion Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91


Efficiency of the Insertion Sort.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Python Code for Sorting Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Stability. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Comparing the Simple Sorts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

4 Stacks and Queues 103


Different Structures for Different Use Cases. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Storage and Retrieval Pattern. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Restricted Access.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
More Abstract.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Stacks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
The Postal Analogy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
The Stack Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Python Code for a Stack. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Stack Example 1: Reversing a Word. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Stack Example 2: Delimiter Matching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Efficiency of Stacks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Queues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
A Shifty Problem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
A Circular Queue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
The Queue Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Python Code for a Queue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Efficiency of Queues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Deques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Priority Queues.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
The PriorityQueue Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Python Code for a Priority Queue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Efficiency of Priority Queues.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
What About Search and Traversal?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Parsing Arithmetic Expressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Postfix Notation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Translating Infix to Postfix. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
The InfixCalculator Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Evaluating Postfix Expressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

9780134855684.indb 6 05/08/22 1:54 PM


Contents vii

5 Linked Lists 157


Links. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
References and Basic Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Relationship, Not Position. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
The LinkedList Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
The Search Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
The Delete Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
The New Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
The Other Buttons. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
A Simple Linked List. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
The Basic Linked List Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Traversing Linked Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Insertion and Search in Linked Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Deletion in Linked Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Double-Ended Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Linked List Efficiency. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Abstract Data Types and Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
A Stack Implemented by a Linked List. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
A Queue Implemented by a Linked List. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Data Types and Abstraction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
ADT Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
ADTs as a Design Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Ordered Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Python Code for Ordered Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Efficiency of Ordered Linked Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
List Insertion Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Doubly Linked Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Insertion and Deletion at the Ends. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Insertion and Deletion in the Middle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Doubly Linked List as Basis for Deques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Circular Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Iterators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Basic Iterator Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Other Iterator Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Iterators in Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

6 Recursion 229
Triangular Numbers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Finding the nth Term Using a Loop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231

9780134855684.indb 7 05/08/22 1:54 PM


viii Data Structures & Algorithms in Python

Finding the nth Term Using Recursion.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232


What’s Really Happening?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Characteristics of Recursive Routines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Is Recursion Efficient?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Mathematical Induction.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Factorials. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Anagrams.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
A Recursive Binary Search. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Recursion Replaces the Loop.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Divide-and-Conquer Algorithms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
The Tower of Hanoi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
The TowerofHanoi Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Moving Pyramids. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
The Recursive Implementation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Sorting with mergesort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Merging Two Sorted Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Sorting by Merging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Merging Subranges. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Testing the Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
The Mergesort Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Efficiency of the mergesort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Eliminating Recursion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Recursion and Stacks.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Simulating a Recursive Function: Triangular. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Rewriting a Recursive Procedure: mergesort.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Some Interesting Recursive Applications. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Raising a Number to a Power. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
The Knapsack Problem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Combinations: Picking a Team.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283

7 Advanced Sorting 285


Shellsort.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Insertion Sort: Too Many Copies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
N-Sorting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Diminishing Gaps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
The AdvancedSorting Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289

9780134855684.indb 8 05/08/22 1:54 PM


Contents ix

Python Code for the Shellsort.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291


Other Interval Sequences.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Efficiency of the Shellsort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Partitioning. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
The Partition Process.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
The General Partitioning Algorithm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Efficiency of the Partition Algorithm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Quicksort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
The Basic Quicksort Algorithm.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Choosing a Pivot Value. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
A First Quicksort Implementation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Running Quicksort in the AdvancedSorting Visualization Tool. . . . . . 309
The Details.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Degenerates to O(N2) Performance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Median-of-Three Partitioning.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Handling Small Partitions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
The Full Quicksort Implementation.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Removing Recursion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Efficiency of Quicksort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Radix Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Algorithm for the Radix Sort.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Designing a Radix Sort Program. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Efficiency of the Radix Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Generalizing the Radix Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Using a Counting Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Timsort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Efficiency of Timsort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332

8 Binary Trees 335


Why Use Binary Trees?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Slow Insertion in an Ordered Array. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Slow Searching in a Linked List. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Trees to the Rescue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
What Is a Tree?.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Tree Terminology. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Root. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Path. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Parent.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338

9780134855684.indb 9 05/08/22 1:54 PM


x Data Structures & Algorithms in Python

Child.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Sibling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Leaf. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Subtree. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Visiting.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Traversing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Levels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Keys. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Binary Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Binary Search Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
An Analogy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
How Do Binary Search Trees Work?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
The Binary Search Tree Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Representing the Tree in Python Code.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Finding a Node. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Using the Visualization Tool to Find a Node. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Python Code for Finding a Node.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Tree Efficiency. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Inserting a Node. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Using the Visualization Tool to Insert a Node.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Python Code for Inserting a Node. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Traversing the Tree.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
In-order Traversal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Pre-order and Post-order Traversals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Python Code for Traversing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Traversing with the Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Traversal Order. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Finding Minimum and Maximum Key Values. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Deleting a Node.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Case 1: The Node to Be Deleted Has No Children. . . . . . . . . . . . . . . . . . . . . . . . . 367
Case 2: The Node to Be Deleted Has One Child. . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Case 3: The Node to Be Deleted Has Two Children. . . . . . . . . . . . . . . . . . . . . . . 370
The Efficiency of Binary Search Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Trees Represented as Arrays.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Tree Levels and Size. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Printing Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Duplicate Keys.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
The BinarySearchTreeTester.py Program. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
The Huffman Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Character Codes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Decoding with the Huffman Tree. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Creating the Huffman Tree. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389

9780134855684.indb 10 05/08/22 1:54 PM


Contents xi

Coding the Message. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391


Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397

9 2-3-4 Trees and External Storage 401


Introduction to 2-3-4 Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
What’s in a Name?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
2-3-4 Tree Terminology. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
2-3-4 Tree Organization.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
Searching a 2-3-4 Tree. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Insertion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Node Splits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
Splitting the Root. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Splitting on the Way Down. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
The Tree234 Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
The Random Fill and New Tree Buttons. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
The Search Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
The Insert Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
Zooming and Scrolling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Python Code for a 2-3-4 Tree. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
The __Node Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
The Tree234 Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Traversal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
Deletion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Efficiency of 2-3-4 Trees.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Speed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Storage Requirements.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
2-3 Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Node Splits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Promoting Splits to Internal Nodes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Implementation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
Efficiency of 2-3 Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
External Storage.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Accessing External Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
Sequential Ordering. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
B-Trees.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
Indexing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Complex Search Criteria.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Sorting External Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453

9780134855684.indb 11 05/08/22 1:54 PM


xii Data Structures & Algorithms in Python

Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460

10 AVL and Red-Black Trees 463


Our Approach to the Discussion.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Balanced and Unbalanced Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Degenerates to O(N). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Measuring Tree Balance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
How Much Is Unbalanced?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
AVL Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
The AVLTree Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Inserting Items with the AVLTree Visualization Tool. . . . . . . . . . . . . . . . . . . . . 472
Python Code for the AVL Tree. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
The Efficiency of AVL Trees.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Red-Black Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
Conceptual. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
Top-Down Insertion.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
Bottom-Up Insertion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Red-Black Tree Characteristics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Using the Red-Black Tree Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
Flipping a Node’s Color. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Rotating Nodes.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
The Insert Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
The Search Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
The Delete Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
The Erase & Random Fill Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
Experimenting with the Visualization Tool.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
Experiment 1: Inserting Two Red Nodes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
Experiment 2: Rotations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
Experiment 3: Color Swaps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Experiment 4: An Unbalanced Tree. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
More Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
The Red-Black Rules and Balanced Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Null Children. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Rotations in Red-Black Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Subtrees on the Move. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Inserting a New Node.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Preview of the Insertion Process. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Color Swaps on the Way Down.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Rotations After the Node Is Inserted. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501

9780134855684.indb 12 05/08/22 1:54 PM


Contents xiii

Rotations on the Way Down.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505


Deletion.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
The Efficiency of Red-Black Trees.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
2-3-4 Trees and Red-Black Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Transformation from 2-3-4 to Red-Black. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Operational Equivalence. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
Red-Black Tree Implementation.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521

11 Hash Tables 525


Introduction to Hashing.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
Bank Account Numbers as Keys. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
A Dictionary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Hashing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
Collisions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Open Addressing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Linear Probing.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Python Code for Open Addressing Hash Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Quadratic Probing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Double Hashing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
Separate Chaining.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
The HashTableChaining Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
Python Code for Separate Chaining. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Hash Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Quick Computation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Random Keys. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Nonrandom Keys.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
Hashing Strings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
Folding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Hashing Efficiency. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
Open Addressing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
Separate Chaining. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Open Addressing Versus Separate Chaining.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Hashing and External Storage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Table of File Pointers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Nonfull Blocks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Full Blocks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589

9780134855684.indb 13 05/08/22 1:54 PM


xiv Data Structures & Algorithms in Python

Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595

12 Spatial Data Structures 597


Spatial Data.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Cartesian Coordinates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Geographic Coordinates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598
Computing Distances Between Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Distance Between Cartesian Coordinates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Circles and Bounding Boxes.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Clarifying Distances and Circles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Bounding Boxes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
The Bounding Box of a Query Circle in Cartesian Coordinates. . . . . . 603
The Bounding Box of a Query Circle in Geographic
Coordinates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
Implementing Bounding Boxes in Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
The CircleBounds Subclass.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Determining Whether Two Bounds Objects Intersect. . . . . . . . . . . . . . . . . . . . 609
Determining Whether One Bounds Object Lies Entirely Within
Another. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
Searching Spatial Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
Lists of Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Creating an Instance of the PointList Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Inserting Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
Finding an Exact Match. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
Deleting a Point. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
Traversing the Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Finding the Nearest Match. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Grids. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Implementing a Grid in Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
Creating an Instance of the Grid Class.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Inserting Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
Finding an Exact Match. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Big O and Practical Considerations.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Deleting and Traversing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
Finding the Nearest Match. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624
Does the Query Circle Fall Within a Layer?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Does the Query Circle Intersect a Grid Cell?.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
Generating the Sequence of Neighboring Cells to Visit. . . . . . . . . . . . . . . . . 629

9780134855684.indb 14 05/08/22 1:54 PM


Contents xv

Pulling It All Together: Implementing Grid’s findNearest(). . . . . . . . . . . . 630


Quadtrees.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Creating an Instance of the QuadTree Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Inserting Points: A Conceptual Overview. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Avoiding Ambiguity.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
The QuadTree Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
Implementing Quadtrees: The Node Class.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
The insert Method. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641
Efficiency of Insertion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Finding an Exact Match. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Efficiency of Exact Search. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Traversing the Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Deleting a Point. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Finding the Nearest Match. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Finding a Candidate Node. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Finding the Closest Node. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Pulling It All Together: Implementing QuadTree’s findNearest(). . . . . 652
Efficiency of findNearest(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
Theoretical Performance and Optimizations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
Practical Considerations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
Further Extensions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658
Other Operations.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658
Higher Dimensions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663

13 Heaps 665
Introduction to Heaps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666
Priority Queues, Heaps, and ADTs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
Partially Ordered. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
Insertion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
Removal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
Other Operations.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674
The Heap Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674
The Insert Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
The Make Random Heap Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676
The Erase and Random Fill Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676
The Peek Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
The Remove Max Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
The Heapify Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677

9780134855684.indb 15 05/08/22 1:54 PM


xvi Data Structures & Algorithms in Python

The Traverse Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677


Python Code for Heaps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
Insertion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679
Removal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
Traversal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
Efficiency of Heap Operations.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
A Tree-Based Heap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
Heapsort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
Sifting Down Instead of Up. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
Using the Same Array.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688
The heapsort() Subroutine. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
The Efficiency of Heapsort.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
Order Statistics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
Partial Ordering Assists in Finding the Extreme Values. . . . . . . . . . . . . . . . . . 695
The Efficiency of K Highest. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703

14 Graphs 705
Introduction to Graphs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
Definitions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706
The First Uses of Graphs.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Representing a Graph in a Program. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709
Adding Vertices and Edges to a Graph. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
The Graph Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715
Traversal and Search.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Depth-First.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
Breadth-First. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
Minimum Spanning Trees.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734
Minimum Spanning Trees in the Graph Visualization Tool. . . . . . . . . . . . 735
Trees Within a Graph. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736
Python Code for the Minimum Spanning Tree. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
Topological Sorting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740
Dependency Relationships.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Directed Graphs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742
Sorting Directed Graphs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742
The Graph Visualization Tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743
The Topological Sorting Algorithm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744
Cycles and Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Python Code for the Basic Topological Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746

9780134855684.indb 16 05/08/22 1:54 PM


Contents xvii

Improving the Topological Sort.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748


Connectivity in Directed Graphs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
The Connectivity Matrix. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Transitive Closure and Warshall’s Algorithm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Implementation of Warshall’s Algorithm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 762
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763

15 Weighted Graphs 767


Minimum Spanning Tree with Weighted Graphs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
An Example: Networking in the Jungle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
The WeightedGraph Visualization Tool.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
Building the Minimum Spanning Tree: Send Out the
Surveyors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770
Creating the Algorithm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775
The Shortest-Path Problem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783
Travel by Rail. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783
Dijkstra’s Algorithm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784
Agents and Train Rides. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784
Finding Shortest Paths Using the Visualization Tool.. . . . . . . . . . . . . . . . . . . . . 790
Implementing the Algorithm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794
Python Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795
The All-Pairs Shortest-Path Problem.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797
Efficiency. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 800
Intractable Problems. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801
The Knight’s Tour. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 802
The Traveling Salesperson Problem.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 802
Hamiltonian Paths and Cycles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803
Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805
Questions.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806
Experiments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808
Programming Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 809

16 What to Use and Why 813


Analyzing the Problem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814
What Kind of Data?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814
How Much Data?.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
What Operations and How Frequent?.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 816
Who Will Maintain the Software?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817
Foundational Data Structures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818

9780134855684.indb 17 05/08/22 1:54 PM


xviii Data Structures & Algorithms in Python

Speed and Algorithms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819


Libraries.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Linked Lists.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 821
Binary Search Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822
Balanced Search Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822
Hash Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823
Comparing the General-Purpose Storage Structures.. . . . . . . . . . . . . . . . . . . . . . 824
Special-Ordering Data Structures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 824
Stack. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825
Queue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825
Priority Queue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826
Comparison of Special-Ordering Structures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826
Sorting.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826
Specialty Data Structures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Quadtrees and Grids. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Graphs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
External Storage.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
Sequential Storage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
Indexed Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
B-trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Hashing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Choosing Among External Storage Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Virtual Memory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Onward. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831

Appendixes

A Running the Visualizations 833


For Developers: Running and Changing the Visualizations. . . . . . . . . . . . . . . . . . . . 834
Getting Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 834
Getting Git. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
Getting the Visualizations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
For Managers: Downloading and Running the Visualizations. . . . . . . . . . . . . . . . . 836
For Others: Viewing the Visualizations on the Internet. . . . . . . . . . . . . . . . . . . . . . . . . 837
Using the Visualizations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838

B Further Reading 841


Data Structures and Algorithms.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 841

9780134855684.indb 18 05/08/22 1:54 PM


Contents xix

Object-Oriented Programming Languages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 842


Object-Oriented Design (OOD) and Software Engineering. . . . . . . . . . . . . . . . . . . . . 842

C Answers to Questions 845


Chapter 1, "Overview". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845
Chapter 2, "Arrays". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 846
Chapter 3, "Simple Sorting". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 847
Chapter 4, "Stacks and Queues". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 848
Chapter 5, "Linked Lists". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 848
Chapter 6, "Recursion". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 849
Chapter 7, "Advanced Sorting". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 850
Chapter 8, "Binary Trees". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 851
Chapter 9, "2-3-4 Trees and External Storage". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 851
Chapter 10, "AVL and Red-Black Trees". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
Chapter 11, "Hash Tables".. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
Chapter 12, "Spatial Data Structures". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
Chapter 13, "Heaps". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 854
Chapter 14, "Graphs". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
Chapter 15, "Weighted Graphs".. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 856

Index 859

9780134855684.indb 19 05/08/22 1:54 PM


Pearson’s Commitment to Diversity,
Equity, and Inclusion
Pearson is dedicated to creating bias-free content that reflects the diversity of all learners.
We embrace the many dimensions of diversity, including but not limited to race, ethnic-
ity, gender, socioeconomic status, ability, age, sexual orientation, and religious or political
beliefs.

Education is a powerful force for equity and change in our world. It has the potential to
deliver opportunities that improve lives and enable economic mobility. As we work with
authors to create content for every product and service, we acknowledge our responsibil-
ity to demonstrate inclusivity and incorporate diverse scholarship so that everyone can
achieve their potential through learning. As the world’s leading learning company, we
have a duty to help drive change and live up to our purpose to help more people create a
better life for themselves and to create a better world.

Our ambition is to purposefully contribute to a world where

▶▶ Everyone has an equitable and lifelong opportunity to succeed through learning

▶▶ Our educational products and services are inclusive and represent the rich diversity
of learners

▶▶ Our educational content accurately reflects the histories and experiences of the
learners we serve

▶▶ Our educational content prompts deeper discussions with learners and motivates
them to expand their own learning (and worldview)

While we work hard to present unbiased content, we want to hear from you about any
concerns or needs with this Pearson product so that we can investigate and address them.

Please contact us with concerns about any potential bias at https://www.pearson.com/


report-bias.html.

9780134855684.indb 20 05/08/22 1:54 PM


To my mother, who gave me a thirst for knowledge,
to my father, who taught me the joys of engineering,
and to June, who made it possible to pursue both.

John Canning

For my father Sol Broder, computer science pioneer,


for leading the way.
To my mother Marilyn Broder, master educator,
for inspiring me to teach.
To Fran, for making my life complete.

Alan Broder

9780134855684.indb 21 05/08/22 1:54 PM


Register your copy of Data Structures & Algorithms in Python at informit.com for conve-
nient access to downloads, updates, and corrections as they become available.​To start the
registration process, go to informit.com/register and log in or create an account. Enter the
product ISBN 9780134855684 and click Submit. Once the process is complete, you will
find any available bonus content under "Registered Products."

Visit the book’s website, https://datastructures.live, to join the conversation with other
readers about the book, and learn more about the visualizations that bring data structures
to life.

9780134855684.indb 22 05/08/22 1:54 PM


Acknowledgments
From John Canning and Alan Broder

Robert Lafore’s Java-based version of this book has been a mainstay in Data Structures
courses and professionals’ reference shelves around the world for many years. When
Alan’s Data Structures course at Stern College for Women of Yeshiva University moved on
to Python, the inability to use Lafore’s book in the course was a real loss. We’re thus espe-
cially happy to bring this new and revised edition to the world of Python programmers
and students.

We’d like to thank the many students at Stern who contributed to this book either
directly or indirectly over the past several years. Initial Python versions of Lafore’s Java
implementations were central to Alan’s Python-based courses, and Stern student feedback
helped improve the code’s clarity, enhanced its performance, and sometimes even identi-
fied and fixed bugs!

For their valuable feedback and recommendations on early drafts of this new edition, we
are grateful to many students in Alan’s Data Structures courses, including Estee Brooks,
Adina Bruce, Julia Chase, Hanna Fischer, Limor Kohanim, Elisheva Kohn, Shira Orlian,
Shira Pahmer, Jennie Peled, Alexandra Roffe, Avigail Royzenberg, Batia Segal, Penina
Waghalter, and Esther Werblowsky. Our apologies if we’ve omitted anyone’s name.

An open-source package of data structure visualizations is available to enhance your study


of this book, and Stern students played an active role in the development of the visual-
ization software. John and Alan extend many thanks to the Stern student pioneers and
leaders of this project, including Ilana Radinsky, Elana Apfelbaum, Ayliana Teitelbaum, and
Lily Polonetsky, as well as the following past and present Stern student contributors and
mentors: Zoe Abboudi, Ayelet Aharon, Lara Amar, Natania Birnbaum, Adina Bruce, Chani
Dubin, Sarah Engel, Sarah Graff, Avigayil Helman, Michal Kaufman, Sarina Kofman, Rachel
Leiser, Talia Leitner, Shani Lewis, Rina Melincoff, Atara Neugroschl, Shira Pahmer, Miriam
Rabinovich, Etta Rapp, Shira Sassoon, Shira Schneider, Mazal Schoenwald, Shira Smith, Riva
Tropp, Alexandra Volchek, and Esther Werblowsky. Also, many thanks to the Stern faculty
who mentored student participants: Professor Ari Shamash, Professor Lawrence Teitelman,
and Professor Joshua Waxman. Our apologies if we have left anyone off this list.

Many thanks go to Professor David Matuszek of the University of Pennsylvania for his
early contributions of ideas and PowerPoint slides when Alan first started teaching Data
Structures at Stern. Many of the slides available in the Instructors Resources section have
their origin in his clear and well-designed slides. Also, we are grateful to Professor Marian
Gidea of the Department of Mathematics of Yeshiva University for his insights into spher-
ical trigonometry.

Finally, we owe a great debt to the talented editors at Pearson who made this book a
reality: Mark Taber, Kim Spenceley, Mandie Frank, Chuti Prasertsith, and Chris Zahn.
Without their many talents and patient help, this project would just be an odd collection
of text files, drawings, and source code.

9780134855684.indb 23 05/08/22 1:54 PM


From Robert Lafore for the Java-based versions of the book

Acknowledgments to the First Edition,


Data Structures and Algorithms in
Java
My gratitude for the following people (and many others) cannot be fully expressed
in this short acknowledgment. As always, Mitch Waite had the Java thing figured out
before anyone else. He also let me bounce the applets off him until they did the job,
and extracted the overall form of the project from a miasma of speculation. My editor,
Kurt Stephan, found great reviewers, made sure everyone was on the same page, kept the
ball rolling, and gently but firmly ensured that I did what I was supposed to do. Harry
Henderson provided a skilled appraisal of the first draft, along with many valuable sugges-
tions. Richard S. Wright, Jr., as technical editor, corrected numerous problems with his
keen eye for detail. Jaime Niño, Ph.D., of the University of New Orleans, attempted to
save me from myself and occasionally succeeded, but should bear no responsibility for
my approach or coding details. Susan Walton has been a staunch and much-appreciated
supporter in helping to convey the essence of the project to the nontechnical. Carmela
Carvajal was invaluable in extending our contacts with the academic world. Dan Scherf
not only put the CD-ROM together, but was tireless in keeping me up to date on rapidly
evolving software changes. Finally, Cecile Kaufman ably shepherded the book through its
transition from the editing to the production process.

Acknowledgments to the Second


Edition
My thanks to the following people at Sams Publishing for their competence, effort, and
patience in the development of this second edition. Acquisitions Editor Carol Ackerman
and Development Editor Songlin Qiu ably guided this edition through the complex
production process. Project Editor Matt Purcell corrected a semi-infinite number of gram-
matical errors and made sure everything made sense. Tech Editor Mike Kopak reviewed
the programs and saved me from several problems. Last but not least, Dan Scherf, an old
friend from a previous era, provides skilled management of my code and applets on the
Sams website.

9780134855684.indb 24 05/08/22 1:54 PM


About the Authors
Dr. John Canning is an engineer, computer scientist, and researcher. He earned an S.B.
degree in electrical engineering from the Massachusetts Institute of Technology and a
Ph.D. in Computer Science from the University of Maryland at College Park. His varied
professions include being a professor of computer science, a researcher and software
engineer in industry, and a company vice president. He now is president of Shakumant
Software.

Alan Broder is clinical professor and chair of the Department of Computer Science at
Stern College for Women of Yeshiva University in New York City. He teaches introductory
and advanced courses in Python programming, data structures, and data science. Before
joining Stern College, he was a software engineer, designing and building large-scale data
analysis systems. He founded and led White Oak Technologies, Inc. as its CEO, and later
served as the chairman and fellow of its successor company, Novetta, in Fairfax, Virginia.
Robert Lafore has degrees in Electrical Engineering and Mathematics, has worked as a
systems analyst for the Lawrence Berkeley Laboratory, founded his own software company,
and is a best-selling writer in the field of computer programming. Some of his titles are
Object-Oriented Programming in C++ and Data Structures and Algorithms in Java.

9780134855684.indb 25 05/08/22 1:54 PM


xxvi Data Structures & Algorithms in Python

Introduction
What’s in this book? This book is designed to be a practical introduction to data structures
and algorithms for students who have just begun to write computer programs. This intro-
duction will tell you more about the book, how it is organized, what experience we expect
readers will have before starting the book, and what knowledge you will get by reading it
and doing the exercises.

Who This Book Is For


Data structures and algorithms are the core of computer science. If you’ve ever wanted
to understand what computers can do, how they do it, and what they can’t do, then you
need a deep understanding of both (it’s probably better to say "what computers have
difficulty doing" instead of what they can’t do). This book may be used as a text in a data
structures and/or algorithms course, frequently taught in the second year of a univer-
sity computer science curriculum. The text, however, is also designed for professional
programmers, for high school students, and for anyone else who needs to take the next
step up from merely knowing a programming language. Because it’s easy to understand,
it is also appropriate as a supplemental text to a more formal course. It is loaded with
examples, exercises, and supplemental materials, so it can be used for self-study outside of
a classroom setting.

Our approach in writing this book is to make it easy for readers to understand how data
structures operate and how to apply them in practice. That’s different from some other
texts that emphasize the mathematical theory, or how those structures are implemented
in a particular language or software library. We’ve selected examples with real-world appli-
cations and avoid using math-only or obscure examples. We use figures and visualization
programs to help communicate key ideas. We still cover the complexity of the algorithms
and the math needed to show how complexity impacts performance.

What You Need to Know Before You Read This Book


The prerequisites for using this book are: knowledge of some programming language and
some mathematics. Although the sample code is written in Python, you don’t need to
know Python to follow what’s happening. Python is not hard to understand, if you’ve
done some procedural and/or object-oriented programming. We’ve kept the syntax in the
examples as general as possible,

More specifically, we use Python version 3 syntax. This version differs somewhat from
Python 2, but not greatly. Python is a rich language with many built-in data types and librar-
ies that extend its capabilities. Our examples, however, use the more basic constructs for two
reasons: it makes them easier to understand for programmers familiar with other languages,
and it illustrates the details of the data structures more explicitly. In later chapters, we do
make use of some Python features not found in other languages such as generators and list
comprehensions. We explain what these are and how they benefit the programmer.

9780134855684.indb 26 05/08/22 1:54 PM


Introduction xxvii

Of course, it will help if you’re already familiar with Python (version 2 or 3). Perhaps
you’ve used some of Python’s many data structures and are curious about how they are
implemented. We review Python syntax in Chapter 1, "Overview," for those who need
an introduction or refresher. If you’ve programmed in languages like Java, C++, C#,
JavaScript, or Perl, many of the constructs should be familiar. If you’ve only programmed
using functional or domain-specific languages, you may need to spend more time becom-
ing familiar with basic elements of Python. Beyond this text, there are many resources
available for novice Python programmers, including many tutorials on the Internet.

Besides a programming language, what should every programmer know? A good knowl-
edge of math from arithmetic through algebra is essential. Computer programming is
symbol manipulation. Just like algebra, there are ways of transforming expressions to
rearrange terms, put them in different forms, and make certain parts more prominent,
all while preserving the same meaning. It’s also critical to understand exponentials in
math. Much of computer science is based on knowing what raising one number to a
power of another means. Beyond math, a good sense of organization is also beneficial
for all programming. Knowing how to organize items in different ways (by time, by
function, by size, by complexity, and so on) is crucial to making programs efficient and
maintainable. When we talk about efficiency and maintainability, they have particular
meanings in computer science. Efficiency is mostly about how much time it takes to
compute things but can also be about the amount of space it takes. Maintainability refers
to the ease of understanding and modifying your programs by other programmers as
well as yourself.

You’ll also need knowledge of how to find things on the Internet, download and install
software, and run them on a computer. The instructions for downloading and running the
visualization programs can be found in Appendix A of this book. The Internet has made
it very easy to access a cornucopia of tools, including tools for learning programming and
computer science. We expect readers to already know how to find useful resources and
avoid sources that might provide malicious software.

What You Can Learn from This Book


As you might expect from its title, this book can teach you about how data structures make
programs (and programmers) more efficient in their work. You can learn how data organi-
zation and its coupling with appropriate algorithms greatly affect what can be computed
with a given amount of computing resources. This book can give you a thorough under-
standing of how to implement the data structures, and that should enable you to imple-
ment them in any programming language. You can learn the process of deciding what data
structure(s) and algorithms are the most appropriate to meet a particular programming
request. Perhaps most importantly, you can learn when an algorithm and/or data structure
will fail in a given use case. Understanding data structures and algorithms is the core of
computer science, which is different from being a Python (or other language) programmer.

The book teaches the fundamental data structures that every programmer should know.
Readers should understand that there are many more. These basic data structures work in
a wide variety of situations. With the skills you develop in this book, you should be able

9780134855684.indb 27 05/08/22 1:54 PM


xxviii Data Structures & Algorithms in Python

to read a description of another data structure or algorithm and begin to analyze whether
or not it will outperform or perform worse than the ones you’ve already learned in partic-
ular use cases.

This book explains some Python syntax and structure, but it will not teach you all its
capabilities. The book uses a subset of Python’s full capabilities to illustrate how more
complex data structures are built from the simpler constructs. It is not designed to teach
the basics of programming to someone who has never programmed. Python is a very
high-level language with many built-in data structures. Using some of the more primi-
tive types such as arrays of integers or record structures, as you might find in C or C++,
is somewhat more difficult in Python. Because the book’s focus is the implementation
and analysis of data structures, our examples use approximations to these primitive types.
Some Python programmers may find these examples unnecessarily complex, knowing
about the more elegant constructs provided with the language in standard libraries. If you
want to understand computer science, and in particular, the complexity of algorithms,
you must understand the underlying operations on the primitives. When you use a data
structure provided in a programming language or from one of its add-on modules, you
will often have to know its complexity to know whether it will work well for your use
case. Understanding the core data structures, their complexities, and trade-offs will help
you understand the ones built on top of them.

All the data structures are developed using object-oriented programming (OOP). If
that’s a new concept for you, the review in Chapter 1 of how classes are defined and used
in Python provides a basic introduction to OOP. You should not expect to learn the full
power and benefits of OOP from this text. Instead, you will learn to implement each data
structure as a class. These classes are the types of objects in OOP and make it easier to
develop software that can be reused by many different applications in a reliable way.

The book uses many examples, but this is not a book about a particular application area of
computer science such as databases, user interfaces, or artificial intelligence. The examples
are chosen to illustrate typical applications of programs, but all programs are written in a
particular context, and that changes over time. A database program written in 1970 may
have appeared very advanced at that time, but it might seem very trivial today. The exam-
ples presented in this text are designed to teach how data structures are implemented,
how they perform, and how to compare them when designing a new program. The exam-
ples should not be taken as the most comprehensive or best implementation possible of
each data structure, nor as a thorough review of all the potential data structures that could
be appropriate for a particular application area.

Structure
Each chapter presents a particular group of data structures and associated algorithms.
At the end of the chapters, we provide review questions covering the key points in the
chapter and sometimes relationships to previous chapters. The answers for these can be
found in Appendix C, "Answers to Questions." These questions are intended as a self-test
for readers, to ensure you understood all the material.

9780134855684.indb 28 05/08/22 1:54 PM


Introduction xxix

Many chapters suggest experiments for readers to try. These can be individual thought
experiments, team assignments, or exercises with the software tools provided with the
book. These are designed to apply the knowledge just learned to some other area and help
deepen your understanding.

Programming projects are longer, more challenging programming exercises. We provide a


range of projects of different levels of difficulty. These projects might be used in classroom
settings as homework assignments. Sample solutions to the programming projects are avail-
able to qualified instructors from the publisher and the website, https://datastructures.live.

History
Mitchell Waite and Robert Lafore developed the first version of this book and titled it Data
Structures and Algorithms in Java. The first edition was published in 1998, and the second
edition, by Robert, came out in 2002. John Canning and Alan Broder developed this
version using Python due to its popularity in education and commercial and noncommer-
cial software development. Java is widely used and an important language for computer
scientists to know. With many schools adopting Python as a first programming language,
the need for textbooks that introduce new concepts in an already familiar language drove
the development of this book. We expanded the coverage of data structures and updated
many of the examples.

We’ve tried to make the learning process as painless as possible. We hope this text makes
the core, and frankly, the beauty of computer science accessible to all. Beyond just under-
standing, we hope you find learning these ideas fun. Enjoy yourself!

9780134855684.indb 29 05/08/22 1:54 PM


Random documents with unrelated
content Scribd suggests to you:
tulivat sinne. Minä lausuin muutamia valittelun ja moitteen sanoja
siitä, mitä oli tapahtunut, ja kehoitin sitä tai niitä, jotka toivoivat
saada lausua jotakin, esittämään sen, mutta kukaan ei
ilmoittautunut. Sijaiskansleri otti silloin puheenvuoron ja piti
nuhdesaarnan ylioppilaille esittäen Tarton yliopiston kohtalon meille
varoittavana esimerkkinä. Yleisen käsityksen mukaan ei tilanne siitä
parantunut. Iltapäivällä kutsuin luokseni Sarven ja Söderhjelmin ja
osoitin minkälainen heidän käytöksensä oli. He tunnustivat
tottelemattomuutensa rehtoria kohtaan ja olivat valmiit kärsimään
rangaistuksen, mutta katsoivat toimineensa velvollisuutensa
mukaisesti. He antoivat myöskin ymmärtää, että heidän käytöksensä
oli voittanut kannatusta myöskin yliopistonopettajien keskuudessa.
Itse asiassa oli eräs professori viittaamalla kehoittanut heitä
jatkamaan lukemista, kun rehtori oli sen kieltänyt.

Samana päivänä kävi kenraalikuvernööri Obolenskij minun luonani.


Sattumalta vai tahallaanko hän juuri sinä päivänä saapui, sitä en
tiedä, mutta välikohtaus avajaistilaisuudessa oli hänelle tuttu. Hän
sanoi kuulleensa, että meillä oli ollut pieni "jupakka" yliopistolla.
Minä tein aivan lyhyesti selkoa siitä, millainen se oli, ja rauhoitin
häntä sillä, että asialla ei ollut mitään erityistä merkitystä ja että se
oli yliopiston sisäinen asia, jonka me kyllä selvittäisimme. Hän sanoi,
että hänellä oli aihetta luulla, että mielenosoitus oli lähtöisin
"samasta puolueesta, missä tehdään työtä valtiopäiviä vastaan,
koska pelätään sen kantaa". Tämän hämärän viittauksen sisältö ei
tullut minulle selväksi.

Kaksi päivää myöhemmin kokoontui kurinpitotoimikunta. Sarven ja


Söderhjelmin kuulustelusta kävi selville, että he olivat saaneet
tehtävänsä eräältä toveripiiriltä ja heidät oli velvoitettu lukemaan
vastalausekirjelmä itse avajaistilaisuudessa heti rehtorin puheen
jälkeen. He olivat kyllä otaksuneet, että rehtori kieltäisi heitä
esiintymästä, mutta päättäneet siitä huolimatta täyttää tehtävänsä.
He olivat ennen tilaisuuden alkua saaneet sanani ja samaten selvästi
ymmärtäneet, mitä minä salissa lausuin. Lausuntoni jälkeen olivat he
epäröineet hetkisen, mutta sitten päättäneet jatkaa. Vastalause piti
luettaman juuri avajaistilaisuudessa, koska se sen kautta saisi
enemmän pontta. Rikoksen arvioimisesta ja rangaistuksen määrästä
olivat mielipiteet toimikunnan kesken kahtalaisia. Syyttäjä vaati
heidät erotettaviksi yhden lukukauden ajaksi. Enemmistö oli
kuitenkin sitä mieltä, että mitään ylemmän viranomaisen
halveksimista osoittavaa ei tässä ollut tapahtunut. Muodollisesti
katsoen oli rikkomus tosin karkea, mutta oli otettava huomioon teon
siveellinen sisältö. Lieventävänä asianhaarana täytyi heidän
mielipiteensä mukaan myöskin pitää sitä rohkaisua, jota vastaajat
yleisön puolelta olivat saaneet, ja erittäinkin sitä seikkaa, että joukko
yliopistonopettajia jäi saliin sijaiskanslerin ja rehtorin poistuttua.
Myöntäen kaiken tämän, olisin kuitenkin omasta puolestani pitänyt
erottamisrangaistusta sopivimpana, mutta minä taivuin enemmistön
mielipiteeseen ja yhdyin siihen, että rikkomus rangaistaisiin
muistutuksella kurinpitotoimikunnan edessä. Jos minä lausunnossani
olisin vaatinut erottamista, olisi se todennäköisesti aiheuttanut sen,
että sijaiskansleri olisi tehnyt rangaistuksen ankarammaksi sen
mukaisesti, mikä vallitsevissa oloissa olisi ollut onnetonta.

Minulle oli jätetty eräs kirjelmä, jonka oli allekirjoittanut 24


ylioppilasta ja jossa he selittivät olevansa solidaarisia Sarven ja
Söderhjelmin kanssa, koska he olivat olleet mukana sitä päätöstä
tekemässä, joka aiheutti mainittujen herrojen esiintymisen.
Kurinpitotoimikunta ei kuitenkaan tahtonut kiinnittää mitään
huomiota siihen ja vielä vähemmän erääseen, muutaman sadan
miehen allekirjoittamaan kirjelmään, joka sisälsi yleisen
solidaarisuusilmauksen.

Joukko ylioppilaita oli esittänyt pyynnön, että saataisiin pitää


yleinen ylioppilaskokous, jotta voitaisiin esittää mielipiteet avajaisten
tapahtumista. Sen mukaan kuin minulle oli ilmoitettu, haluttiin
ylioppilastaholla sovittaa erimielisyys rehtorin kanssa lausumalla
valittelu tapahtuman johdosta, mutta samalla kertaa tehdä
ymmärrettäväksi, että ylioppilaskunnassa yleensä vallitsivat ne samat
tunteet, mitkä oli ilmaistu vastalausekirjelmässä. Mielestäni oli minun
suostuttava tähän pyyntöön ja minä päätin kokouksessa
julkiluettavaksi lähettää ylioppilaskunnalle kirjelmän. Sittemmin sain
ylioppilaskunnan puheenjohtajalta tietää, että eräillä tahoilla oli
aikomus järjestää kokouksesta suuri mielipiteenilmaisutilaisuus
ylioppilaskunnan puolelta vastalauseen hyväksi sekä että valittelu
juhlasalin tapahtuman johdosta olisi sivuasia. Me sovimme senvuoksi
siitä, että keskustelu on rajoitettava itse tapahtumaan, kuitenkin
siten, että lausunnoissa voitiin ilmituoda, että yhdyttiin niihin
tunteisiin, jotka ilmautuivat vastalauseessa. Äänestys ei saisi tulla
kysymykseen.

Kirjelmässäni ylioppilaskunnalle tein selkoa sen tapahtuman


kulusta, josta oli kysymys, ja lausuin ankaran paheksumiseni
tottelemattomuudesta rehtoria kohtaan ja julkisen tilaisuuden
häiritsemisestä, mutta kirjelmä oli kuitenkin kirjoitettu
hyväntahtoiseen sävyyn. Minä lausuin, että minä en voinut paheksua
sitä, että nuoriso lukukauden alkaessa oli tahtonut ilmaista
tunteitansa. Mutta minun täytyi valittaa, että ne esitettiin tavalla,
jonka täytyi herättää kiusallista, itse asialle vierasta erimielisyyttä
rehtorin kanssa, herättää yliopiston johtomiesten ja opettajien
paheksumista ja aiheuttaa kurinpidollisia toimenpiteitä. Kaikki tämä
olisi voitu välttää, ilman että lausunnon tarkoituksesta senkautta
mitään olisi menetetty, jos olisi neuvoteltu rehtorin kanssa tai
noudatettu rehtorin kehoitusta ja sitä keinoa käytetty, jonka hän oli
neuvonut. Kun kirjelmä oli luettu, syyskuun 19 päivän kokouksessa,
esitettiin vanhasuomalaiselta taholta, että, vaikka ne samat tunteet,
jotka saivat ilmauksensa avajaisissa luetussa vastalauseessa,
vallitsivat heidänkin puolueensa ylioppilaissa, tämä puolue kuitenkin
jyrkästi paheksui sitä sopimatonta ja asiaan kuulumatonta tapaa,
millä vastalause oli tuotu esille. Nuorsuomalaiset ja ruotsinmieliset
ilmaisivat täysin yhtyvänsä ylioppilasten kirjelmään, mutta valittivat,
että sen esittämistavan johdosta oli syntynyt erimielisyyttä rehtorin
ja ylioppilasten välille. Kun oli todettu, että rehtorin kirjelmä ei
aiheuttanut mitään toimenpidettä, lopetettiin kokous.

Kenraalikuvernöörille oli tehty huomautus minun viimeisen


avajaispuheeni johdosta ja hän luuli huomaavansa jonkunlaista
yhteyttä sen ja ylioppilasten vastalauseen välillä. Hän antoi
Deutrichin ilmoittaa Danielsonille, että ylioppilasten esitys
avajaistilaisuudessa, "joka oli suunnattu viranomaisten toimenpiteitä
vastaan, näyttää perustuvan yliopiston rehtorin sitä ennen pidettyyn
puheeseen", joka sisälsi "samantapaisia lauseita kuin ylioppilasten
esitys" j.n.e. Kenraalikuvernööri valitti myöskin v.t. kanslerille, joka
sen johdosta kirjeessä lausui tyytymättömyytensä puheeseen. Hän
luuli vielä olevansa velvollinen ilmoittamaan siitä H.
Majesteetillensakin ja pelkäsi, että asia olisi esteenä vastasyntyneen
perintöruhtinaan kansleriksi nimittämiselle!

[Kirje sijaiskanslerille kuului käännettynä seuraavasti: "Siitä Teid.


Ylh. minulle lähettämästä puheesta, jonka rehtori on pitänyt uuden
lukuvuoden alkaessa, olen huomannut, että valtioneuvos Hjelt, kun
hän puheessa koskettelee muutamia tapauksia Suomen elämästä,
jotka eivät ole välittömässä yhteydessä yliopiston kanssa, on
lausunut mietteitä, joiden tarkoituksena on ollut arvostella tilannetta,
joka viimeaikaisten hallinnollisten toimenpiteiden kautta on syntynyt.
Ryhtymättä käsittelemään näiden arvostelujen oikeutta sinänsä, on
minun mielipiteeni se, että ne eivät ensinkään sovi puheeseen, jossa
yliopiston hallitus kääntyy opiskelevan nuorison puoleen, ja pyydän
Teid. Ylhäisyyttänne saattamaan tämän valtioneuvos Hjeltin tietoon.

"Sen lisäksi katson tarpeelliseksi lisätä, että tyytymättömyys, jonka


rehtorin mainittu puhe on herättänyt Suomen kenraalikuvernöörissä,
pakottaa minua saattamaan sen Kaikkein Korkeimman tietoon, ja
minä pelkään, että tämä asiaintila voi estää suostumuksen yliopiston
traditsioneille perustuvaan toivomukseen saada kansleriksensa H.
Keis. Korkeutensa Perintöruhtinas."]

Obolenskijn luona käydessään huomautti sijaiskansleri, että luulo


ylioppilasten, esiintymisen ja minun puheeni välisestä ulkonaisesta
yhteydestä johtui täydellisestä väärinkäsityksestä. Oblenskij syrjäytti
asian lausumalla vain sen yleisen arvelun, että siitä saattoi olla vain
vahinkoa yliopistolle, jos siellä politikoitiin.

Se seikka, että osa virkatovereista jäämällä juhlasaliin siksi ajaksi,


jolloin useinmainittu vastalause luettiin, ja suosiotansa osoittamalla
antoi ylioppilaille yllykettä esiintymään niinkuin esiintyivät ja olemaan
välittämättä rehtorin käskystä, oli, niinkuin jo on huomautettu,
aiheuttanut nuorisossa sen käsityksen, että nämä opettajat olivat
asettuneet heidän puolellensa rehtoria vastaan. Tämä seikka sekä
ruotsalaisille sanomalehdille lähetetyt kirjeet, joissa samaa asiaa
käytettiin hyökkäysaseena minua vastaan, ja se käsitys, että
yliopistonopettajien puolelta oli vähennetty minun rehtorinarvoani ja
vaikutustani ylioppilaisiin, saattoivat minut vakavasti ajattelemaan
eronpyynnön jättämistä. Sen lisäksi tuli nuhtelu korkeammasta
paikasta, joka saattoi minua otaksumaan, että vaikutusvaltani oli
silläkin taholla vähentynyt. Minä luovuin kuitenkin silloin siitä
aikomuksesta, koska minusta kollegialiselta näkökannalta ei tuntunut
olevan oikein odottamatta ja valmistamatta jättää paikkaani, sitä
enemmän kuin muutamat virkatoverit, joille olin maininnut
aikomuksestani, ehdottomasti kehoittivat minua luopumaan
aikeestani. Konsistorin kokouksessa lokakuun 1 päivänä pidin minä
kuitenkin puheen, joka oli osoitettu virkatovereille, ja jossa tein
selkoa niistä vaikuttimista, jotka olivat saaneet minut ajattelemaan
eroa rehtorinvirasta, ja lausuin vakavasti ja jyrkästi mielipiteeni
muutamien virkatoverien menettelystä juhlasalissa sattuneen
tapahtuman aikana (ks. myöh.). Lausunto tuli odottamatta
useimmille ja sillä oli ilmeinen vaikutus.

Seuraavassa kokouksessa luki professori Runeberg minulle


osoitetun lausunnon konsistorin jäsenten enemmistön puolesta, joka
oli luottamuslauseen luontoinen, puheeni johdosta edellisessä
konsistorin kokouksessa. Se sisälsi vakuutuksen virkatoverien
täydellisestä luottamuksesta, vaikka lausunto "ei sisältänytkään
tunnustuksen antamista jokaiseen yksityiseen tekoon tai
toimenpiteeseen nähden, mitä rehtori on toimittanut niissä
harvinaisen voimaa kysyvissä ja huolekkaissa oloissa, jotka niin
suuressa määrässä ovat vaikeuttaneet yliopiston asiain johtoa".
Lausunto päättyi sanoilla: "Meillä on myöskin se toivo ja luottamus,
että Teidän tahtonne ja Teidän voimanne sen raskaan taakan
kantamiseen, joka nykyisissä oloissa Teidän harteillanne lepää, ei
ennen aikojansa horju eikä uuvu." Selitykseen oli yhtynyt 26
konsistorin 32 jäsenestä. Sitten luki professori A. Homén lausunnon
niiden puolesta, jotka olivat jääneet saliin, senjälkeen kuin
sijaiskansleri ja rehtori olivat poistuneet. Siinä huomautettiin, että
heidän käytöstään ei millään tavoin tulisi käsittää siten, että se olisi
mielenosoitus rehtoria kohtaan. Näiden lausuntojen johdosta sanoin
minä muutamia sanoja, osaksi vielä selvittääkseni lausuntoani
edellisessä konsistorin kokouksessa, osaksi ilmaistakseni
kiitollisuuttani niiden selitysten ja sen tunnustuksen johdosta, joita
minä olin saanut osakseni. Konsistorin jäsenet nousivat ja kumarsivat
ja minä samoin. Siten oli tämä sisäinen erimielisyys sovitettu.

*****

Yllämainittu lausuntoni, jonka konsistorin kokouksessa lokakuun 1


päivänä annoin, kuului pienin lyhennyksin seuraavasti:

"Yliopiston Rehtorinvirka on ehkäpä enemmän kuin mikään muu


hallinnollinen virka maassamme luottamustoimi. Tämä tulee
varsinkin selvästi esille poliittisesti levottomina aikoina. Että minä
pääasiallisessa tehtävässäni, työssäni yliopiston häiritsemättömän
työn ja kehityksen hyväksi, olen onnistunut, kuten rohkenen uskoa,
verrattain hyvin, riippuu siitä, että minä runsaassa määrin olen
saanut nauttia virkatoverieni luottamuksellista tukea, että minä olen
nuorison taholta voinut odottaa arvonantoa ja kunnioitusta ja että
minulla myöskin yliopiston korkeampien viranomaisten keskuudessa
on ollut jotakin arvovaltaa ja siten olen saattanut vaikuttaa jonkun
verran myöskin ylöspäin. On olemassa seikkoja, jotka pakosta
saavat minut olettamaan, että nuo mainitut edellytykset
rehtorinviran menestykselliseksi hoitamiseksi eivät enää
täydellisesti ole vallitsemassa, jonka vuoksi tehtävä nykyään
vallitsevien olosuhteiden aikana näyttää minusta oleellisesti
vaikeammalta kuin ennen.

Mikä lähinnä on aiheuttanut tuon minun käsitykseni asiasta, on


yhteydessä sen häiritsevän tapauksen kanssa, joka sattui tämän
lukukauden avajaisjuhlallisuuksien aikana. Vaikka minä syvästi
valitan sitä tottelemattomuutta, johon kaksi ylioppilasta silloin teki
itsensä syypääksi, en kuitenkaan pidä tätä seikkaa
merkitsevimpänä, sillä heidän tottelemattomuutensa johtui
harhautuneesta velvollisuuden tunteesta, eikä sen tarkoituksena
ollut millään tavalla ilmaista kunnioituksen puutetta rehtoria
kohtaan. Paljoa enemmän merkitsee minulle se seikka, että tämä
heidän esiintymisensä, joka tapahtui huolimatta siitä, että rehtori
virantoimessa ollen oli sellaisen kieltänyt, sai tukea ja yllykettä
yliopiston opettajien puolelta, joiden joukossa oli myöskin
konsistorin jäseniä, osittain sen kautta, että he jäivät saliin,
senjälkeen kuin sijaiskansleri, rehtori ja osa yliopiston
opettajakuntaa oli mennyt pois, osittain suoranaisten
suosionosoitusten kautta. "Etteivät kaikki ne yliopiston opettajat,
jotka saliin jäivät, tehneet sitä mielenosoituksellisessa
tarkoituksessa, sen tiedän sangen hyvin, mutta se ei paljoa vaikuta
asiaan. Nuoriso sai sen käsityksen, että siinä selkkauksessa, joka oli
syntynyt rehtorin ja niiden ylioppilasten välillä, jotka olivat
toimeenpanneet mainitun mielenosoituksen, useat rehtorin omista
virkatovereista olivat asettuneet häntä vastaan ja niiden puolelle,
jotka olivat loukanneet hänen virka-arvoansa. Sen kautta sai
selkkaus paljoa suuremman merkityksen kuin mitä se muutoin olisi
saanut. Samaan suuntaan on tapausta käytetty hyväksi myöskin
sanomalehdistössä, erittäin ulkomaisessa. Sijaiskansleri, rehtori ja
muutamia yliopiston opettajia asetetaan toiselle puolelle, koko
opiskeleva nuoriso ja suuri enemmistö yliopiston opettajia toiselle.
Edelliset ovat raukkamaisuuden edustajia, jälkimmäiset rohkean
mielen. Minä tiedän hyvin, että tämä kuva on väärä, ja että
totuudenrakkaus ei ole ollut kuljettamassa niitä käsiä, jotka ovat
sen luoneet, mutta jo se seikka, että sellainen asian tulkinta syntyy
ja näkyy sekä yksityisissä piireissä että julkisuudessa, saa
epäilemään, että maanalaista työtä on tehty. Mikä vaikutus kaikella
sellaisella on nuorisoon, on selvää. Toiselta puolelta alenee tämän
kautta rehtorin vaikutus nuorisoon, toisaalta saa tämä siitä uutta
yllykettä jatkamaan sitä tietä, jolle on lähtenyt. Tämä painaa paljon
enemmän mieltäni kuin se seikka, että muutamat nuorukaiset eivät
äkisti voineet löytää oikeata tietä vaikeassa tilanteessa ja siten
saivat aikaan rehtorin kanssa selkkauksen, joka itsessään oli
verrattain muodollinen. — — —

Minun täytyy suoraan sanoa, että minä tämän tapahtuman


johdosta en tunne olevani varma siitä, että minä mahdollisissa
uusiutuvissa häiriöissä, jotka pakottavat rehtoria käyttämään
virkavaltaansa lain määräämissä rajoissa, voin odottaa kaikkien
virkatoverien kannatusta.

Minun täytyy vielä lisätä, että minun asemani ylöskinpäin on


käynyt heikommaksi. Kenraalikuvernööriltä sijaiskanslerille tulleessa
kirjelmässä on rehtoria syytetty siitä, että hän puheellansa on
antanut aihetta siihen ylioppilasten kirjoitukseen, joka luettiin
avajaistilaisuudessa. Tähän päättömään syytökseen minä
luonnollisesti en paljoakaan huomiota pane, mutta myöskin
yliopiston kanslerilta olen saanut nuhteen avajaistilaisuudessa
pitämästäni puheesta, koska minä hänen mielestänsä siinä olen
ylittänyt sen rajan, mitä sellaisessa tilaisuudessa yliopiston
hallituksen puolelta nuorisolle voidaan sanoa; siis saman puheen
johdosta, jota toisella taholla on leimattu hyvin penseäksi ja
värittömäksi, ja siellä täällä vähän alamaisen ryömimisen
maustamaksi. Minä mainitsen tämän osoittaakseni kuinka jyrkästi
vastakkaisia vaatimuksia näinä aikoina rehtorin täytettäviksi
tahdotaan panna. Koko asia tuntuisi humoristiselta, jollei se samalla
olisi niin vakava. Kansleri tulee esittämään rikollisiksi katsotut
lausunnot H. Majesteetilleen. Mitä seurauksia siitä saattaa olla
minulle henkilökohtaisesti, siitä minä huolin vähemmän ja ero olisi
minulle tervetullutkin, mutta kanslerin kirjelmässä on myöskin
sellainen viittaus, että minun esiintymisestäni saattaa olla joitakin
seurauksia yliopistolle, ja tämä ei voi olla minulle yhdentekevää.
Joka tapauksessa on minun ja v.t. kanslerin välille tämän kautta
syntynyt jonkunlainen juopa, joka ei suinkaan ole eduksi
yliopistolle.

Niinkuin Herrat sanotusta huomannevat, olisi minulla ollut


vakavia syitä, jos olisin täyttänyt aikeeni ja nyt jo jättänyt paikkani
virkatoverien ja kanslerin täytettäväksi. Jos olosuhteet kehittyisivät
siihen suuntaan, että huomaan, etten enää voi täyttää rehtorin
vastuunalaisia tehtäviä, niin täytyy minun saada katsoa itseni täysin
oikeutetuksi ottamaan mainittu askel."

*****

Professori Runebergin lokakuun 15 p:n kokouksessa useimpien


konsistorin jäsenten puolesta lukema lausunto oli kokonaisuudessaan
tällainen:

"Herra Rehtori! Konsistorin viime kokouksessa lokakuun 7


päivänä lausuitte Te, Herra Rehtori, että Te viime aikoina olitte ollut
huomaavinanne erikoisia epäluottamuksen ja tyytymättömyyden
merkkejä, jotka kohdistuisivat Rehtorin tapaan johtaa Yliopiston
asioita. Te ilmeisesti ajattelette, että Te ehkä ette enää nauttisi
samaa virkatoverienne luottamusta ja tukea kuin ennen ja joka olisi
välttämätön, jotta Te voisitte oikein täyttää sen paikan, mikä
yliopiston Rehtorilla tulee olla. Tämän johdosta on suuri osa
Konsistorin jäseniä katsonut tarpeelliseksi antaa puolestansa
selitystä ja siinä mielessä he ovat antaneet minun tehtäväkseni
vanhimpana joukostansa Teille, Herra Rehtori, lausua sen varman
vakautuksen, että Teidän virkatoverienne usko ja luottamus ei ole
horjunut eikä muuttunut siitä ajasta saakka, jolloin Teidät melkein
yksimielisesti valittiin Yliopiston Rehtoriksi. Tämä lausunto
luonnollisestikaan ei sisällä tunnustuksen antamista jokaiseen
yksityiseen tekoon tahi toimenpiteeseen nähden, mitä Herra
Rehtori on toimittanut niissä harvinaisen voimaa kysyvissä ja
huolekkaissa oloissa, jotka niin suuressa määrässä ovat
vaikeuttaneet Yliopiston asiain johtoa, eikä se myöskään edellytä
täydellistä käsitysten ja katsantotapojen yhtäpitäväisyyttä yleensä;
se katsantokanta, mistä lähtien yksityisiä ilmiöitä katselee ja
arvostelee, jää pakostakin toisenlaiseksi sille, joka ei ole mukana
asiain suoranaisessa käytännöllisessä toimittamisessa, kuin sille,
jonka tehtävänä on mahdollisuuden mukaan toteuttaa johtavia
periaatteita todellisen elämän moninaisissa ja kirjavissa oloissa.
Mutta me tahtoisimme saada sanotuksi, että Teidän toimintanne
Yliopiston Rehtorina suurin piirtein ja kokonaisuutena katsoen
täysin ansaitsee meidän pysyvän kiitollisuutemme, sekä että Teillä
edelleen on virkatoverienne keskuudessa sama luottamus ja sama
tuki kuin ennenkin. Meillä on myöskin se toivo ja luottamus, että
teidän voimanne ja Teidän tahtonne sen raskaan taakan
kantamiseen, joka nykyisissä oloissa harteillanne lepää, ei ennen
aikojansa horju eikä uuvu."

Ylioppilaslakkosuunnitelmia syksyllä 1904.


Toisessa yhteydessä on mainittu, että niinhyvin nuorempien
yliopistonopettajien kuin ylioppilasten keskuudessa oli suunniteltu
lakkoa syyslukukauden alkuun 1904 vastalauseeksi muutamien
yliopiston opettajien karkoittamista vastaan, mutta asia sai tällä
kertaa raueta, kun konsistorin esitys kyseessäolevan väkivallanteon
suhteen tuli tunnetuksi. Sen sijaan toimeenpantiin se
mielipiteenilmaus avajaistilaisuudessa, josta edellisessä luvussa on
kerrottu. Mutta suunnitelmista ei oltu kokonaan luovuttu. Minun
velvollisuuteni rehtorina oli luonnollisesti koettaa estää työn
lopettamista yliopistossa, erittäinkin kun mielipiteet sen
sopivaisuudesta olivat hyvin erilaisia, enkä minäkään siitä saattanut
odottaa suotuisia tuloksia.

Lokakuun lopulla sain minä tietää, että ruotsinmielisissä


ylioppilaspiireissä ja Keskusteluseurassa jälleen oli neuvoteltu
yleisestä opintolakosta sen johdosta, että karkoitettuja
yliopistonopettajia yhä edelleen pidettiin maanpaossa. Lakon
alkamiseksi oli ajateltu tulevan kevätlukukauden alkua. Silloin olisivat
valtiopäivät koolla ja yleinen lakko yliopistossa tukisi ja antaisi pontta
sen vastustavalle kannalle. Aluksi piti muutamien valtuutettujen
käydä kaikkien professorien luona tutkiakseen heidän ajatustaan
lakkokysymyksestä. Kolme nuorta miestä Keskusteluseurasta kävi
luonani pian sen jälkeen, mutta vain kysyäkseen mihin
toimenpiteisiin konsistorin kirjelmä karkoitetuista oli johtanut, tai
mihin sen voitiin otaksua johtavan, ilman että lakkokysymystä
suoranaisesti kosketeltiin.

Marraskuun 1 päivänä ilmoitettiin minulle, että ylioppilaat


seuraavana päivänä pitäisivät kokouksen, jossa pohdittaisiin
kysymystä mahdollisesta yliopistotasosta. Ensimmäinen ajatukseni
oli, etten puuttuisi asiaan, erittäinkin kun minulla oli syytä otaksua,
että tulokseksi tulisi lakkoajatuksesta luopuminen. Seuraavana
aamuna sain kuitenkin tietää, että kokous pidettäisiin ylioppilastalon
suuressa juhlasalissa, sekä että painettuja kutsulippuja oli suuri
määrä jaettu. Kun kokous tämän kautta oleellisesti oli menettänyt
yksityisen luonteensa, katsoin velvollisuudekseni kieltää sen
pitämisen. Rehtorin lupaa kokouksen pitämiseen ei oltu pyydetty,
enkä minä olisi voinut puolustaa sellaista seikkaa, että niin laaja
ylioppilaskokous, jolla oli mainitunlainen tarkoitus, oli pidetty minun
tieteni ja minun sanattomalla suostumuksellani. Vastuu siitä olisi
kokonaan tullut minulle. Sijaiskansleri, joka myöskin oli kuullut
aiotusta kokouksesta, telefonoi minulle ja kysyi, olinko minä ryhtynyt
tarpeellisiin toimenpiteisiin sen ehkäisemiseksi, mihin minä voin
vastata myöntävästi. Minä kutsuin ylioppilastalon taloudenhoitajan
luokseni ja kun hän sai tietää, että kokous oli kutsuttu kokoon ilman
rehtorin lupaa sekä että minä en voinut antaa suostumustani sen
pitämiseen, sanoi hän ilmoittavansa sille ylioppilaalle, joka oli tilannut
salin, että sitä ei tarkoitusta varten voitu saada, sekä lupasi pitää
huolta siitä, että ovet pidettiin suljettuina. Itse kutsuin minä luokseni
maisteri F. Salzmanin ja kandidaatti Sarven, jotka kuuluivat niihin,
joiden tehtävänä oli ollut kokouksen järjestäminen. He myönsivät
toimineensa lain' vastaisesti, kun he ilman rehtorin lupaa olivat
kokoonkutsuneet kokouksen, mutta, selittivät he, ajat olivat sellaiset,
että ylioppilasten täytyi omin päin politikoida, ja niin ollen ei voinut
välttää, että mahdollisesti rikottiin laillisia muotoja. Mihinkään
muuhun tulokseen ei keskustelu johtanut, kuin että kieltoni
ilmoitettaisiin niille, jotka saapuisivat kokoukseen.

Kokous oli kutsuttu kello 7:ksi. Minä olin käskenyt pari pedelliä
ylioppilastalolle ja pysyttelin itse läheisyydessä siltä varalta, että
minun henkilökohtainen asiaan puuttumiseni tulisi tarpeelliseksi. Kun
moneen sataan nouseva joukko ylioppilaita sai tiedon kiellostani ja
näki salin ovien olevan suljettuina, kokoontuivat he ylioppilastalon
portaille ja torille sen ulkopuolelle. He pysyivät rauhallisina, mutta
eivät poistuneet pedellien kehoituksista huolimatta. Mutta myöskin
poliiseja saapui paikalle, ja koska pelkäsin selkkauksia syntyvän
niiden kanssa, menin itse paikalle ja kuljin muutamia kertoja
kansanjoukon läpi, kehoittaen ylioppilaita poistumaan. Osa vetäytyi
syrjään, mutta kokous ei sanottavasti pienentynyt. Vaikka minua ei
millään tavalla häiritty ja vaikka kohtelu olikin sopivaa, huomasin
kuitenkin, että mieliala oli hyvin katkeroitunut. Minä puhelin
muutamien vanhempien ylioppilasten kanssa, jotka ilmoittivat
minulle, että lähetystö oli lähetetty minun luokseni, vaan ei vielä ollut
palannut, sekä että juuri sitä odotettiin. Minä päätin mennä kotiin ja
sovittiin siitä, että lähetystö uudelleen tulisi luokseni. Vanhemmat
ylioppilaat selittivät, että ylioppilaat silloin seuraisivat jäljessä ja että
joukko siten hajaantuisi.

Hetken perästä saapui lähetystö luokseni, ja sillä välin ylioppilaat


täyttivät porraskäytävään ja kadullekin ulkopuolelle kokoontui suuri
joukko ihmisiä. Pedellit ja poliisit olivat seuranneet mukana.
Lähetystöön kuului 14 henkeä, kaksi kustakin osakunnasta. Puhetta
johti lähinnä eräs ylioppilas Nyman, joka sanoi tulleensa valituksi
puheenjohtajaksi. Hänen esiintymisensä oli kiihoittunutta ja
yksinkertaista, ja olin huomaavinani, että toverit olivat jonkun verran
hämillään siitä mitä hän puhui. Hän selitti, että kokouksen
kieltäminen oli herättänyt suurta katkeruutta nuorisossa, ja vaati
kiellon kumoamista. Minä en antanut häiritä rauhaani ja vastasin,
että oli mahdotonta sallia kokouksen pitämistä. Kiellolla ei ollut
mitään tekemistä tunteitteni kanssa nuorisoa kohtaan; minä olin vain
tehnyt virkavelvollisuuteni enkä ollut voinut toimia toisin. Muutamat
muutkin lähetystön jäsenet lausuivat mielipiteensä, mikä aiheutti
lyhyen mielipiteiden vaihdon. Syy, miksi ylioppilaat tahtoivat
kokoontua, oli se, että heidän vastalauseensa avajaisissa ei vielä
ollut johtanut mihinkään tulokseen eikä konsistorin esityksestä
myöskään ollut näkynyt mitään seurausta. Meidän keskustelumme
päättyi minun jyrkkään selitykseeni, että kokousta ei voitu pitää,
mutta että minä kutsuisin osakuntien inspehtorit kokoon seuraavaksi
päiväksi neuvotellakseni heidän kanssaan asiasta. Heidän
arvosteluunsa täytyi minun olettaa ylioppilasten luottavan. Kun
lähetystö oli poistunut, ilmoitettiin minun vastaukseni
porraskäytävään kokoontuneille ylioppilaille. Sen jälkeen lähtivät
kaikki hiljaa ja rauhallisesti pois. Koko tämä selkkaus nuorison
kanssa pahoitti mieltäni, mutta se ei ollut vältettävissä.

Kokouksessa, joka pidettiin seuraavana päivänä, olivat kaikki


osakuntain inspehtorit, yhtä lukuunottamatta, joka oli epäilevällä
kannalla, yksimielisiä siitä, että olin tehnyt velvollisuuteni, kun olin
kieltänyt kokouksen. Ei ainoastaan, että se oli laittomasti
kokoonkutsuttu, vaan rehtori ei voinut, niin arvelivat inspehtorit,
antaa hyväksymystänsä kokoukselle, jossa ylioppilasten piti
neuvotella siitä, täyttäisivätkö he velvollisuutensa vai eivätkö. Erään
inspehtorin mielestä olisi ehkä ollut viisaampaa, jollei ovia olisi
suljettu, vaan ylioppilaat olisivat saaneet sinne kokoontua. Jos he
sitten kiellosta huolimatta olisivat pitäneet kokouksensa, olisi rehtori
voinut ryhtyä rangaistustoimenpiteisiin. Omasta puolestani täytyi
minun olla sitä mieltä, että tilanne sellaisesta toiminnasta vain olisi
pahentunut. Sovittiin siitä, että inspehtorit yksityisesti antaisivat
osakunnille tiedoksi, että he hyväksyivät rehtorin toiminnan.

Muutamia päiviä myöhemmin pitivät ylioppilaat salaisen kokouksen


uusmaalaisen osakunnan talolla lakkokysymyksestä. Noin 400
henkeä lienee ollut läsnä. Useimmat puhuivat lakon puolesta, mutta
äänestettäessä, ratkaistaisiinko asia nyt vai eikö, tuli 200 ääntä lakon
puolesta ja 190 vastaan. Kun enemmistö oli niin vähäinen, katsottiin
kysymyksen tällä kertaa täytyvän raueta, mutta se päätettiin ottaa
uudelleen käsiteltäväksi seuraavan lukukauden alussa. Keskustelussa
huomautettiin usealta taholta, että vähintään 700 ylioppilaan pitäisi
äänestää lakkoa, jos sellainen ylipäänsä voisi tulla kysymykseen.
Yksityistä tietä olin saanut tiedon kokouksesta, mutta päätin olla
siihen sekautumatta, mikä lienee ollut onnellisinta.

Lakkopuuhista ei sittemmin enää kuulunut mitään. Seuraavan


lukukauden alkaessa ei enää ollut aihetta ottaa kysymystä
käsiteltäväksi.

Aktivistisia pyrkimyksiä 1904—1905.

Routavuosien sortojärjestelmää vastaan oli noussut passiivinen


vastarinta, joka ilmeni lähinnä yksityisten henkilöiden impulsiivisina
tekoina, mutta joka sitten kehittyi järjestelmälliseksi
puolustuspolitiikaksi koko yhteiskunnan puolelta. Tässä
puolustusmuodossa, joka perustui puhtaan laillisuuden pohjalle, oli
paljon siveellistä voimaa, mutta sen vaikutus väheni sen kautta, että
taistelu suuntautui sellaisia voimia ja henkilöitä vastaan, joihin
oikeudelliset ja siveelliset vaikuttimet eivät paljoakaan tehonneet.
Passiiviseen vastarintaan vastattiin uusilla väkivallanteoilla, jotka
usein olivat karkeata lajia, mikä yhä enemmän kiihdytti mieliä. Tällä
tarkoitamme lähinnä maanpakoonajamis- ja karkoitustoimenpiteitä.
Oli luonnollista, että kun olot olivat sellaiset, sellainen mieli, joka
suuntautui aktiivisempaan puolustuspolitiikkaan, voittaisi puolelleen
ennen muita nuorison. Se ilmeni siten, että oltiin yhä enemmän
taipuvaisia ulkonaisiin mielenosoituksiin, mutta yksityisissä
henkilöissä se herätti myöskin sen ajatuksen, että piti vastustaa
väkivaltaa väkivallalla. Yleensä pysyi akateeminen nuoriso koko
ensimmäisen routavuosiajanjakson aikana passiivisen
vastarintapolitiikan yleisessä taktiikassa, mutta sen lopulla ilmeni
yksityisissä heistä myöskin puhtaasti aktivistisia pyrkimyksiä. Vuoden
1904:n alussa tulin niiden kanssa kosketuksiin. Samoinkuin muut
kansalaiset, joilla oli vastuunalainen asema maassamme, pidin aluksi
aktivistista liikettä hyvin arveluttavana ja omiaan yhä suuremmassa
määrin vaikeuttamaan asemaamme epätasaisessa taistelussamme.

Ensimmäinen sellaisen äktivistisen toiminnan ilmaus, vaikkakin


jonkun verran lapsellinen ja epäselvä, oli attentaattiyritys Vaasan
poliisimestaria, af Enehjelmiä vastaan, tammikuun alussa 1904.
Yrityksessä oli osallisina kaksi ylioppilasta, B.K. Westlin ja O.W.
Eriksson, jotka heti vangittiin. Vaasan kuvernööri, Knipowitsch,
ilmoitti minulle tapahtumasta. Hän piti asiaa poliittisena ja oli
kenraalikuvernöörille lähettämässänsä raportissa esittänyt sen
murhayrityksenä poliisimestaria vastaan.

Minä matkustin ensimmäisellä junalla Vaasaan ja kävin viipymättä


kuvernöörin luona, joka ulkonaiselta esiintymiseltään oli ystävällinen
ja verrattain sävyisä keski-ikäinen mies. Hän antoi minulle luvan
saada nähdä kuulustelupöytäkirjan sekä käydä vangittujen
ylioppilasten luona. Pöytäkirja luettiin minulle kuvernöörin,
lääninsihteeri Ivanoffin, kaupunginviskaalin ja erään poliisikomisarion
läsnäollessa, jonka jälkeen minä menin vankilaan, jossa johtajan
huoneessa hänen ja erään poliisikomisarion läsnäollessa sain tavata
ensin toista nuorta miestä, sitten toista. Todistajain läsnäolon vuoksi
ei keskustelusta voinut tulla niin vapaa kuin olin toivonut, ja se ei
varmaankaan oikein tyydyttänyt minua eikä heitä. Nuorten miesten
sanan mukaan oli tarkoituksena ollut piestä poliisimestari, niin "että
hän jonkun aikaa olisi kykenemätön virkaansa hoitamaan". Sekin
ajatus, että poliisimestari otettaisiin hengiltä, oli joskus heidän
mielessänsä liikkunut, mutta niin pitkälle asia ei suinkaan olisi
mennyt, jos suunnitelma olisi onnistunut. Mitään yksityisiä
kostovaikuttimia nuorukaiset eivät sanoneet olleen, vaan he tahtoivat
teossa tuoda ilmi sen tyytymättömyyden, mikä paikkakunnalla
yleisesti vallitsi kapteeni af Enehjelmiä vastaan poliisimestarina, ja
siihen ei ollut vähimpänä syynä hänen suhtautumisensa
asevelvollisuuskutsuntoihin edellisenä keväänä.

Tutkimuksesta oli käynyt selville, että nuorukaiset olivat tahtoneet


houkutella Enehjelmin erääseen syrjäiseen paikkaan, jossa he
väijyisivät ja hyökkäisivät hänen kimppuunsa. Eräs nainen, neiti S.,
erään salapoliisin tytär, oli välittäjänä asiassa. Toinen nuorukaisista
saneli hänelle poliisimestarille osoitetun nimettömän kirjeen, jossa oli
rakkauden ja ihailun tunnustus ja joka päättyi siihen toivomukseen,
että seuraavan päivän iltana tavattaisiin eräässä lähellä kaupunkia
olevassa metsikössä. Poliisimestari lähetti konstaapeleja paikalle,
jotka vangitsivat Erikssonin, kun hän saapui sinne. Kohta sen jälkeen
vangittiin Westlin. Nuorukaisilla oli batongit, nyrkkiraudat, ladatut
revolverit sekä ansa eli jalkavipu, jossa oli pitkä nuora. Tarkoitus oli
ollut koettaa ansalla vetää kumoon poliisimestari ja sitten piestä
hänet. Revolverit olivat mukana kaikkien mahdollisuuksien varalta.
Suoritettuaan teon olivat nuorukaiset aikoneet paeta. Koko asia
tuntui enemmän poikamaiselta seikkailulta kuin hyvin harkitulta
poliittiselta murhasuunnitelmalta. Niiden tietojen mukaan, joita
yksityiseltä taholta sain, lienee neiti S. ollut poliisin kätyri. Hänen
kerrottiin koko ajan olleen yhteydessä poliisilaitoksen kanssa ja oli
hän nähtävästi yhtä aikaa rohkaissut nuorukaisia heidän aikeissaan.
Asia oli siten jossain määrin provokatsioniluontoinen.
Minut oli kutsuttu päivälliselle kuvernöörin luokse, ja luulin
keskustelussa hänen kanssansa saaneeni hänet jotenkin
vakuutetuksi siitä, että asiasta, oli tehty vakavampi tapaus kuin mitä
se itse asiassa oli sekä että suomalaisen tuomioistuimen tulisi
käsitellä oikeusjuttua nuoria miehiä vastaan. Hän sanoi puolestansa
olevansa taipuvainen tähän, mutta että ratkaisu kuului
kenraalikuvernöörille. Kuvernöörin lausumaa ajatusta, että
attentaattiyritys olisi suoranaisessa yhteydessä poliittisen
vastarintatoiminnan kanssa, koetin minä ehdottomasti vastustaa.

Palattuani Helsinkiin annoin minä seikkaperäisen raportin asiasta


sijaiskanslerille, jotta hän toimittaisi sen edelleen kanslerille, sekä
kävin prokuraattori E. Soisalon-Soinisen (Johnssonin) luona. Tämä
sanoi ehdottomasti vaativansa, että asia tulisi suomalaisen
tuomioistuimen käsiteltäväksi, ja hän luuli, että oli sellaisia toiveita.
Jonkun aikaa sen jälkeen ilmoitti hän minulle kuitenkin, että asiaa ei
jätettäisi suomalaisille viranomaisille, vaan että nuorukaiset
luultavasti karkotettaisiin Venäjälle. Syitä tähän päätökseen ei
minulle ilmoitettu. Mahdollisesti oli syynä tähän sekin seikka, että
lakimiespiireissä tunnuttiin olevan epäröivällä kannalla siitä, voitiinko
Suomen rikoslain mukaan langettavaa tuomiota aikaansaada, koska
ainoastaan rikollisen yrityksen valmisteluja oli tapahtunut. Ehkä
vaikutti päätökseen hallinnollisesta rankaisusta sekin seikka, että
poliisin käytös ei sietänyt tulla julkisuuteen.

Helmikuun alussa saapui kanslerilta kirjelmä siitä, että hän oli


erottanut Westlinin ja Erikssonin yliopistosta, johon he sitäpaitsi vain
muodollisesti kuuluivat, koska he valmistautuivat
apteekkarintoimeen. Kirjelmässä lausuttiin, että tämä oli tapahtunut
sen perusteella, mitä kenraalikuvernööri oli asiasta esiintuonut.
Eriksson ja Westlin olivat vangittuina Vaasassa huhtikuun alkuun,
jolloin heidät vietiin Pietariin. Käydessäni Plehwen luona huhtikuun
27 päivänä oli minulla tilaisuus lausua muutamia sanoja nuorten
miesten hyväksi. Minä esitin, eikö heidän pitkäaikaista vankilassa-
oloansa voisi pitää tarpeellisen suurena sovituksena heidän
poikamaisesta teostaan. Asia oli sitäkin säälittävämpää laatua, koska
molemmat olivat köyhien leskien poikia. Plehwe piti kiinni siitä, että
asia oli vakava, ja hän luuli, että nuorukaisten tarkoituksena oli ollut
surmata poliisimestari, minkä minä katsoin voivani väittää vääräksi.
Plehwe teki kirjallisen muistiinpanon selitykseni johdosta, mutta
lievennettiinkö heidän kohtaloansa tämän kautta ollenkaan, sitä en
tiedä. Sen mukaan kuin pian sen jälkeen sain tietää, karkoitettiin
heidät Tscherdinin kaupunkiin Permin kuvernementtiin kolmeksi
vuodeksi. He saivat siellä paikan apteekissa, ja viihtyivät, oman
ilmoituksensa mukaan, suhteellisen hyvin.

Kun maanpakoon ajetut ja karkoitetut kansalaisemme saivat


oikeuden palata kotimaahan, tein kaikkeni, jotta lupa sovellettaisiin
myöskin Westliniin ja Erikssoniin, mutta kenraalikuvernööri asettui
sitä vastustamaan. Venäjän vallankumouksen aikana 1905 jättivät he
kuitenkin omalla vastuullaan karkoituspaikkansa ja palasivat
kotimaahan.

Huolimatta Vaasan attentaattiyrityksen luonteesta olivat


poliisiviranomaiset taipuvaisia pitämään sitä salaliiton tapaisena
ilmiönä ja etsivät rikostovereita. Helmikuun 4 päivänä 1904
ilmoitettiin minulle, että eräs ylioppilas, G. Biaudet, oli vangittu, ja
kun oli toimitettu kotitarkastus ja takavarikoitu kirjeitä ja papereita,
oli hänet viety poliisin huostaan. Minä menin heti poliisimestari
Carlstedtin luokse, joka ilmoitti minulle, että B:ta kuulusteltaisiin sen
johdosta, että hänen otaksuttiin sekaantuneen Vaasan
attentaattiyritykseen. Erityinen komisario oli sieltä saapunut tänne.
Poliisimestari tuli mukanani etsivään osastoon, johon komisario
Pekonen saapui toimittamaan kuulustelua. Minä olin siinä läsnä niin
kauan kuin minulla oli aikaa. Biaudet väitti perättömäksi kaiken
syytöksen osallisuudestansa Vaasan juttuun, josta hän vasta
sanomalehtien kautta oli saanut tiedon. Tässä asiassa ei tullut
mitään positiivista selville ja ilmeisesti oli asia B:lle kokonaan vieras.
Sitävastoin kävi selville, että hän oli ollut yhteydessä herra J.V.
Nylanderin kanssa, joka silloin oli erään maatilan vuokraajana, ja
jota epäiltiin aktivistisista suunnitelmista. B. myönsi, että he usein
olivat seurustelleet keskenänsä ja että silloin myöskin oli keskusteltu
siirtymisestä passiivisesta politiikasta aktiiviseen, joka ei kuitenkaan
suuntautuisi kenraalikuvernööriä ja venäläisiä virkamiehiä vastaan,
vaan niitä suomalaisia, jotka olivat antautuneet järjestelmän
kätyreiksi. Nylander oli myöskin koettanut valmistaa
räjähdyspommeja, mutta ei oman kertomuksensa mukaan ollut siinä
onnistunut. Biaudet koetti selittää, että tämä kaikki oli pelkkää
kuvittelua.

Kuulustelussa, jota edelleen kesti lähes viisi tuntia, en kauempaa


ollut läsnä. Minä sain kuitenkin sen lupauksen, että B. kuulustelun
jälkeen luovutettaisiin minun huostaani. Myöhemmin päivällä minä
kävin lääninsihteerin luona, jonka luona poliisimestarikin juuri oli.
Siellä sain kuulla, että Nylander oli vangittu ja että hänen kodistaan
oli löydetty räjähdysaineita ja pommeja. Jotta kaikki yhteys
Nylanderin kanssa saataisiin katkaistuksi, kunnes tämä oli tuotu
Helsinkiin ja saatettu varmaan talteen, annettiin minun tehtäväkseni
pitää Biaudet'ta vartioituna seuraavaan päivään, minkä lupasin
tehdä.

Kun minulle iltapäivällä ilmoitettiin, että kuulustelu oli päättynyt,


annoin vahtimestarin hakea Biaudet'n kotiini. Yksityisessä
keskustelussa antoi hän minulle nyt seikkaperäisiä tietoja siitä
asiasta, joka oli ollut poliisikuulustelun alaisena, ja myönsi, että oli
ollut olemassa todellinen salainen yhtymä, joka tarkoitti sekä
kenraalikuvernöörin että muiden järjestelmän miesten tieltä
raivaamista. Aluksi oli ollut vain kysymys siitä, että annettaisiin
entisen ylioppilaan, komisario von Grossin kärsiä rangaistus
kavalluksestaan, mutta sitten oli päätetty tähdätä korkeammalle.
Useita henkilöitä oli sekaantunut asiaan. Pommien valmistamista ja
niillä kokeilemista oli johtanut eräs teknikko A. C, joka asui Helsingin
läheisyydessä. Biaudet oli itse ollut läsnä kokeissa, mutta ei arvellut
pommeja sopiviksi. Hän oli alkanut yhä enemmän epäillä, oliko
toivottavaa saattaa suunnitelma täytäntöön ja sen vuoksi, ollen yhä
näennäisesti innostunut asiasta, oli hän koettanut saada sen
toteuttamista lykätyksi. Myöskin muutamat ylioppilaat, joiden nimet
hän mainitsi, olivat mukana suunnitelmia tehtäessä. Erään luona oli
pommivarasto, ja B. pyysi minua kaikella muotoa varoittamaan
häntä. Nämä tiedonannot ja se seikka, että oli olemassa terroristinen
salaliitto, johon ylioppilaita kuului, olivat minulle täydellinen yllätys ja
herättivät minussa suurta levottomuutta ja vakavaa huolestumista.
Minun onnistui samana päivänä myöhään illalla tavata kyseessäoleva
ylioppilas, joka hämmästyi suuresti, kun minä tiesin asiasta, ja lupasi
minulle kunniasanallaan viipymättä hävittää vaarallisen tavaransa ja
mieluimmin upottaa sen meren pohjaan. Tämä kaikki tapahtui
päivää ennen Runebergin satavuotismuiston viettämistä yliopistossa,
ja minun oli tehtävä paljon valmistuksia tätä juhlatilaisuutta varten,
jossa minunkin piti esiintyä. Näiden tapahtumain johdosta olivat
minun hermoni kuitenkin liiaksi vaivautuneet, jotta minulla olisi
saattanut olla mitään juhlamieltä.

Biaudet vapautettiin iltapäivällä helmikuun 5 päivänä. Seuraavana


päivänä ilmoitin minä poliisimestarille ja kuvernöörille, että B. oli
edellisestä illasta saakka vapaa, sekä etten minä ottanut vastuulleni
hänen vartioimistansa. Edellämainittu piti sitä aivan luonnollisena ja
selitti, että poliisi kyllä pitäisi B:ta silmällä. Minä sain sittemmin
tietää, että hän heti päästyään vapaaksi oli matkustanut
kaupungista. Helmikuun 16 päivänä kuulusteltiin etsivässä osastossa
muutamia muita ylioppilaita heidän suhteistaan Nylanderiin, m.m. L.
Hohenthalia ja H. Gummerusta. He selviytyivät ilman erikoisia
vaikeuksia.

Mutta kuulusteluja Nylanderin kanssa jatkettiin. Hänen


tiedonantonsa olivat kuitenkin eräissä kohdissa ristiriitaisia Biaudet'n
antamien tietojen kanssa ja tätä ruvettiin etsimään, jotta häntä
kuulusteltaisiin yhdessä Nylanderin kanssa. Biaudet'ta ei löydetty
enkä minä voinut antaa tietoa hänen olinpaikastaan, sitä vähemmän
koska minulla oli syytä otaksua, että hän jo oli Ruotsissa. Helmikuun
26 päivänä sain minä kuitenkin kirjeen Vaasan tullinhoitajalta, V.
Poppiukselta, että kaupungin ulkopuolella olevassa ulkosaaristossa
oli tullivartiosto vanginnut erään passittoman henkilön, joka sanoi
olevansa ylioppilas Biaudet. Hän tahtoi ilmoittaa minulle siitä siltä
varalta, että halusin taikka saatoin ryhtyä johonkin toimenpiteeseen.
Otaksuen, että tullinhoitaja muuten olisi pakotettu jättämään
Biaudet'n poliisin huostaan, päätin minä viipymättä lähettää pedellin
Vaasaan tuomaan hänet tänne. Pedelli suoritti tehtävänsä ja B.
tuotiin yliopistolle, jossa hän sai tehdä minulle selkoa
pakoyrityksestään. Helposti tunnettavan ulkomuotonsa vuoksi ei hän
ollut uskaltanut käyttää rautatietä hyväkseen, vaan matkusti
rannikkoa pitkin pohjoiseen. Kun tämä kuitenkin oli liian vaivalloista,
oli hän päättänyt, ettei jatkaisi Tornioon saakka, vaan saavuttuaan
Vaasan tienoille oli hän matkustanut saaristoon odottamaan
tilaisuutta päästä Merenkurkun yli. Hänet yllätti kuitenkin lumimyrsky
ja hänen täytyi kymmenen tuntia kuljettuaan luopua yrityksestään ja
joutui matkallansa tulliasemalle. Tullimiehet epäilivät, että B., jonka
ulkomuoto heistä ei näyttänyt luottamusta herättävältä, oli vakooja,
ja kun hänellä ei ollut passia, ilmoittivat he puhelimitse asiasta
tullinhoitajalle, joka antoi tuoda hänet Vaasaan.

Minä käskin Biaudet'n seuraavana aamuna ilmoittautua


poliisikamarissa sekä siellä sanoa, että hän oli kuullut, että häntä oli
kyselty. Mikään muu menettelytapa ei asiain näin ollen ollut
mahdollinen. Mainitsematta mitään siitä, kuinka B. oli joutunut
minun käsiini, ilmoitin rikosasiainkomisario Pekoselle hänen täällä
olostaan, sekä että hän seuraavana päivänä saapuisi sinne. Koska
minä sitä ennen tahdoin kuulla Pekosta, pyysin minä häntä käymään
luonani, ja hän teki keskustelussa selkoa siitä, mitä tutkimuksessa oli
tullut selville. Huolimatta tutkimuksen laihasta tuloksesta sanoi hän
tietävänsä, että oli ollut olemassa salaliitto kenraalikuvernöörin
hengiltä ottamiseksi. Sattumalta oli saatu tietoa siitä. Aikomuksena
oli ollut heittää pommi Tähtitorninvuorelta, kun Bobrikoff menisi
tavalliselle kävelylleen Kaivopuistoon, tai toteuttaa murhayritys, kun
hän määrättynä päivänä Katariinankatua pitkin meni senaattiin, tai
myöskin sijoittaa helvetinkone hänen vaununsa alle hänen
matkustaessaan Pietariin. Pekonen oli kuitenkin sitä mieltä, että jo
joku aika sitten oli luovuttu näistä suunnitelmista. Siitä syystä oli
hänestä näyttänyt parhaalta, ettei kukaan tutkimuksen kautta
joutuisi ikävästi paljastetun asemaan, niin että unhon verho saattoi
peittää koko asian. Tässä pyrkimyksessä sanoi hän tahallansa
johtaneensa tutkimusta siten, että tuloksesta tulisi niin laiha kuin
mahdollista oli. Pekonen antoi myöskin ymmärtää, että hän oli
tehnyt tämän omalla vastuullansa ja isänmaallisessa tarkoituksessa.
Minusta näytti kuitenkin olevan syytä luulla, että myöskin hänen
esimiehillään, poliisimestarilla ja kuvernöörillä, ehkäpä
kenraalikuvernöörilläkin, oli aihetta toivoa, että aiottu murhayritys
viimemainittua vastaan ei tulisi tunnetuksi. Minusta tuntui siltä kuin
prokuraattorikin, jonka luona kävin, olisi ollut samaa mieltä.

Biaudet'ta kuulusteltiin yhdessä Nylanderin kanssa seuraavana


päivänä ja kuulustelu sujui ilman sanottavia vaikeuksia. Oli selvää,
että tahdottiin sievästi sivuuttaa B:n ja N:n tiedonannoissa olevat
ristiriitaisuudet. Muutamia päiviä myöhemmin sai B. vaikeuksitta
passin ja matkusti Ruotsiin. Poliisimestari oli nimenomaan selittänyt,
että se ei kohtaisi mitään esteitä. Myöskin Nylander vapautettiin ja
hän päätti matkustaa pois maasta, mitä häneltä ei kielletty. On sitä
huomattavampaa, että hän niin helposti pääsi tästä asiasta, kun hän
oli erikoisen toimekkaasti sepittänyt ja levittänyt kiellettyä
kirjallisuutta. Hänen luonansa pidetyssä kotitarkastuksessa oli
sellaisia kirjoituksia löydetty suuret joukot. Tämä levottomuutta
herättävä juttu selvisi siis paljon onnellisemmin kuin olin uskaltanut
toivoa. Asianomaisilla oli ilmeisesti hyötyä siitä, että asia hiljaa
haudattiin.

Mitään suoranaista yhteyttä ei ollut niiden terrorististen


suunnitelmien, joista yllä on kerrottu, ja Bobrikoffin murhan välillä,
joka tapahtui seuraavan kesäkuun 16. päivänä. Eugen Schauman oli
yksin suunnitellut ja suorittanut tekonsa. Oli suunniteltu laajaa
tutkimusta oletetusta salaliitosta, jota tutkimusta venäläinen tuomari
johtaisi ja jonka otaksuttiin juureutuvan suomalaisen
vastustuspuolueen miehiin, ja se pantiinkin alulle, mutta sitä ei
saatettu loppuun. Lähimpinä päivinä murhan jälkeen vangittiin
muutamia uusmaalaisen osakunnan ylioppilaita, mutta heidät
vapautettiin kuulustelujen jälkeen.

Kesäkuun 25 päivänä ilmoitettiin minulle, että maisteri H.


Gummerus oli vangittu ja että hän oli poliisikamarissa. Ilmoittaja luuli
syynä siihen olevan sen, että Gummerus päivää jälkeen Schaumanin
hautajaisten oli laskenut kukkia tämän haudalle. Hän oli sen jälkeen
matkustanut eräälle maatilalle Turun lähelle, jossa hänet oli vangittu
ja tuotu tänne. Eräästä etsivän osaston avoimesta ikkunasta oli hän
erään tuttavan ohikulkiessa pudottanut kadulle tyhjän
savukelaatikon, joka sisälsi paperilapun, jossa hän pyysi että hänen
äidilleen ja rehtorille ilmoitettaisiin hänen vangitsemisestaan. Ystävä
suoritti tehtävän viipymättä. Minä menin heti etsivään osastoon ja
sain tietää, että G. oli siellä, mutta että oli ankarasti kielletty
päästämästä ketään vangitun luokse. Yht'aikaa Gummeruksen
kanssa oli myöskin yllämainittu teknikko C. vangittu. Minä kävin
kuvernööri Kaigorodoffin luona, joka selitti, ettei hän
vakavammanlaatuisissa tapauksissa voinut tehdä mitään erotusta
ylioppilasten ja ei-ylioppilasten välillä. Minä kuitenkin pidin kiinni
oikeudestani rehtorina saada ottaa Gummerus haltuuni, ja
kuvernööri lupasi vihdoin, että hänet saataisiin panna karsseriin sillä
ehdolla, ettei hän kirjallisesti eikä suullisesti saisi olla yhteydessä
kenenkään kanssa. Seuraavana päivänä ilmoitti poliisimestari
minulle, että kuvernööri oli peruuttanut lupauksensa, sekä että
Gummerusta ei missään tapauksessa vapautettaisi, koska hänen
luotaan oli löydetty hyvin raskauttavia kirjeitä. Minun oli mahdotonta
nyt tehdä mitään muuta G:n hyväksi. 28 päivänä siirrettiin hänet
lääninvankilaan, ja santarmihallitus otti hänen asiansa
käsiteltäväkseen ratsumestari Tunzelmann von Adlerflugin johdolla.
Käynti, jonka minä tein tämän luokse saadakseni luvan käydä G:n
luona, jäi tuloksettomaksi.

Kuukautta myöhemmin kävi luonani Gummeruksen äiti ja ilmoitti,


että hänen poikansa edellisenä iltana oli otettu vankilasta ja
luultavasti viety Pietariin. Saadakseni selvyyttä asiaan kävin hänen
kanssaan kuvernöörin luona, joka vakuutti asian niin olevan.
Kenraalikuvernööriltä oli tullut käsky, että Gummerus vietäisiin
tutkintovankilaan Pietariin sekä että se tapahtuisi aivan salaisesti.
Mitään muuta ei kuvernööri tiennyt; hän oli toiminut vain
määräyksen mukaan. Minä puhuin sitten kahdenkesken kuvernöörin
kanssa ja luulin päässeeni varmuuteen siitä, että hänellä oli tietoa
terroristisista suunnitelmista, mutta että tutkimus ei ollut osoittanut
mitään yhteyttä Schaumanin murhayrityksen kanssa. Tämä käynti
tapahtui klo 1 päivällä. Rouva Gummerus päätti matkustaa Pietariin
ja pyysi minulta suosituskirjettä Plehwelle. Kymmentä minuuttia
myöhemmin sain minä tiedon siitä, että Plehwe saman päivän
aamuna oli murhattu. Kuvernööri ei ollut mitenkään viitannut siihen
ja hän tuntui olevan aivan normaali ja rauhallinen, vaikka hänellä
varmasti siellä käydessämme oli tietoa asiasta.

Kun minä muutamia päiviä myöhemmin olin Pietarissa Plehwen


hautajaisten johdosta, tapasin minä siellä rouva Gummeruksen. Hän
oli ollut tutkintovankilassa Spalernajassa ja saanut siellä tietää, että
hänen poikansa ei enää ollut siellä, mutta hänelle ei oltu ilmoitettu,
minne hänet oli viety. Me aavistimme, että hänet oli viety Pietari-
Paavalin linnoitukseen, mikä sittemmin näkyikin oikeaksi.

Syyslukukauden alussa kääntyi pohjalainen osakunta minun


puoleeni pyytäen tietoja Gummeruksen asiasta. Minä ilmoitin
ainoastaan, että syytökset olivat vakavia, sekä tein selkoa siitä, mitä
asian hyväksi oli tehty. Osakunta osoitti minulle pyynnön, että minä
yhä edelleen tekisin mitä voisin hänen hyväkseen ja koettaisin ennen
kaikkea saada hänet asetetuksi suomalaisen tuomioistuimen eteen.
Kanslerin puoleen kääntymästä olin kyseessäolevassa tapauksessa
kehoittanut luopumaan, koska siitä vain olisi ollut seurauksena, että
Gummerus olisi erotettu yliopistosta.
Saadakseni tietää kuinka asian laita oli, kävin prokuraattori
Soisalon-Soinisen luona ja pyysin, että hän ajaisi tätä asiaa niin, että
G. asetettaisiin suomalaisen tuomioistuimen eteen ja hän siten saisi
kärsiä rangaistuksensa täällä, jollei hänen asiaansa kokonaan voitaisi
jättää sikseen. Prokuraattori ilmoitti, että G. pian tuotaisiin tänne ja
että suomalaiset viranomaiset tutkisivat hänen asiaansa. Että asia sai
tämän käänteen, oli etupäässä kenraalikuvernööri Obolenskijn ansio.
Prokuraattori oli koettanut taivuttaa kenraalikuvernööriä tähän
suuntaan, ja hän antoi itse ymmärtää, että hänen puuttumisensa
asiaan oli sille antanut ratkaisunsa, jota minä en pitänyt
mahdottomana. Itse asiassa tuotiin G. tänne syyskuun 28 päivänä ja
vietiin lääninvankilaan. Minä kävin siellä hänen luonaan lokakuun 7
päivänä ja hän kertoi silloin seikkaperäisesti kokemuksistaan Pietari-
Paavalin linnoituksessa.

Muutamia päiviä myöhemmin kävin minä jälleen prokuraattorin


luona, joka ilmoitti, että kenraalikuvernööri oli jättänyt G:n asian
hänen huostaansa, mutta että hän ei vielä ollut saanut asiapapereita
santarmihallituksesta. Minä puhuin G:n vapauttamisen puolesta.
Prokuraattori ei antanut mitään lupausta, mutta hän ei näyttänyt
olevan taipumaton tekemään sitä, siinä tapauksessa nimittäin, että
G:ta ei olisi pakko syyttää valtiorikoksesta.

Kun minä marraskuun 3 päivänä kysyin asiasta prokuraattorilta,


sanoi hän tehneensä päätöksensä, mutta ei voinut antaa minulle
muita tietoja kuin että Gummeruksen asia näytti valoisalta.
Obolenskijn kotiinpaluuta täytyi kuitenkin odottaa, ennenkuin mitään
muuta asian hyväksi voitiin tehdä. Minä ymmärsin, että prokuraattori
aikoi ehdottaa G:n vapauttamista. Sen johdosta kävin jälleen tämän
luona ja ilmoitin, että hänellä oli hyviä toiveita, josta hän
luonnollisesti tuli erinomaisen iloiseksi. Kun minä sain tietää, että
Obolenskij palaisi marraskuun 6 päivänä, esitin minä prokuraattorille,
eikö G:ta voitaisi vapauttaa ennen marraskuun 9:ttä, pohjalaisen
osakunnan vuosijuhlapäivää. Vaikuttaisi sangen hyvää, jos niin
tapahtuisi.

Marraskuun 8 päivänä ilmoitti minulle prokuraattori, että


kenraalikuvernööri oli tehnyt päätöksensä ja antanut suostumuksen
G:n vapauttamiseen. Ainoa ehto, joka silloin tehtiin, oli se, että tämä
sitoutuisi olemaan lähtemättä kaupungista. Seuraavana päivänä
päivällisen aikaan menin minä prokuraattorinapulaisen Anthonin
kanssa vankilaan. Ilosta loistaen vastaanotti G. tiedon, että hän oli
vapaa melkein viisi kuukautta kestäneen vankeusaikansa jälkeen.
Minä kehoitin häntä, hänen asiansa vakavaan laatuun nähden,
torjumaan kaikki kunnianosoitukset, jotka tulisivat yksityisen
toveripiirin ulkopuolelta, mitä toivomusta hän piti luonnollisena. G.
allekirjoitti sitten sitoumuksen, joka olisi voimassa siksi kunnes
Hänen Majesteettinsa määräys siitä, että G. ei saisi oleskella
Suomessa, olisi kumottu. (Tämä elokuun 1 päivänä päivätty määräys
oli nähtävästi ollut ensimmäinen askel aiottua karkoitusta kohti.)
Minun kehoituksestani meni G. saman päivän iltana pohjalaisen
osakunnan vuosijuhlaan, jossa hänet vastaanotettiin suurella
riemulla. Tunteet ilmenivät puheessa, joka hänelle pidettiin, ja hän
vastasi puhuen vapaudelle. Sen kautta että toveripiiri heti otti hänet
vastaan, vältettiin julkisemmat ja muodoltansa vähemmän sopivat
mielenosoitukset.

Mitä Gummerusta vastaan toimeenpannussa tutkimuksessa


oikeastaan tuli esille ja mitä hänen syyksensä oikeuden mukaan
voitiin lukea, siitä en asianomaisilta koskaan ole saanut selvää tietoa.
Oman kertomuksensa mukaan oli häntä Pietari-Paavalin linnassa
tosin kuulusteltu terroristisista suunnitelmista, mutta ei mitään tässä
suhteessa raskauttavaa oltu voitu panna hänen syyksensä. Hänen
luonaan takavarikoitu kirjeenvaihto oli pääasiassa koskenut
sanomalehtien "Fria ord" ja "Veckans nyheter" levittämistä ja muita
vähemmän tärkeitä asioita. — Joulukuun 10 päivänä tuli tieto siitä,
että H. Majesteettinsa oli suostunut kenraalikuvernöörin esitykseen
yllämainitun määräyksen kumoamisesta.

*****

Erikoinen aktivististen pyrkimysten järjestö — "Suomen aktiivinen


vastustuspuolue" — oli perustettu joulukuussa 1904 ja antamallansa
julistuksella oli se tehnyt olemassaolonsa tunnetuksi, mutta meidän
yhteiskuntamme ei ollut oikein taipuvainen ottamaan puoluetta
täysin vakavalta kannalta tai ainakaan myöntämään sillä olevan
mitään erikoista käytännöllistä merkitystä. Prokuraattori Soisalon-
Soinisen murha helmikuun 6 päivänä 1905 oli kuitenkin — niin
otaksuttiin — puolueen toiminnan ilmaus. Murhan tekijä, L.
Hohenthal, kuului silloin muodollisesti yliopistoon, mutta ei ollut
kolmeen lukukauteen harjoittanut siellä opintoja eikä myöskään siksi
lukukaudeksi ollut ilmoittautunut. Minä hankin v.t. kanslerilta
oikeuden poistaa hänet ylioppilasluettelosta. Yliopisto pääsi silloin
kaikesta vastuusta ja sekaantumisesta tähän asiaan.

Toimenpide, joka muodolliselta kannalta saattoi näyttää


poikkeukselliselta, mutta asiallisesti oli täysin oikeutettu, herätti
ylioppilaspiireissä jonkun verran huomiota, ja vieläpä moitettakin.
Minä en silloin voinut ilmoittaa erästä seikkaa, joka muiden muassa
oli vaikuttanut päätökseeni. Jo helmikuussa 1904 olin minä nimittäin
saanut tietää, että L. Hohenthal oli sekaantunut edellämainittuun
terroristiseen salaliittoon, minkä johdosta minä olin kutsunut hänet
luokseni ja kehoittanut häntä luopumaan kaikista sellaisista
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebookluna.com

You might also like