This repository contains implementations of popular data structures and interview questions implemented in Python.
Each data structure has its own separate README with related explanations and links for further reading (including ones to YouTube videos).
This project is my attempt to document the materials I have studied on my journey to understand data structures and also prepare for interviews.
A data structure is a particular way of organizing and storing data in a computer so that it can be accessed and modified efficiently. More precisely, a data structure is a collection of data values, the relationships among them, and the functions or operations that can be applied to the data.
The explanations of the data structures below are from Oleksii Trekhleb's Project
B
- Beginner, A
- Advanced
B
Linked ListB
Circular Linked ListB
Doubly Linked ListB
Circular Doubly Linked ListB
QueueB
Priority QueueB
StackB
Hash TableA
HeapA
TrieA
TreeA
Graphs
This section categorizes coding interview problems into a set of 16 patterns. Under each pattern there will be a specific category of problems to solve. The goal is to develop an understanding of the underlying pattern, so that, we can apply that pattern to solve other problems.
- Sliding Window
- Two Pointers
- Fast & Slow Pointers
- Merge Intervals
- Cyclic Sort
- In-Place Reversal of Linkedlist
- Breath First Search
- Depth First Search
- Two Heaps
- Subsets
- Modified Binary Search
- Top K Elements
- K Way Merge
- Topological Sort
- Dynamic Programming Patterns
EPI is an invaluable book textbook presents a comprehensive introduction to modern competitive programming.
Below are solutions & questions found under various topics in the book.
-
E
Binary Tree TraversalE
Is Binary Tree Height BalancedE
Is Binary Tree SymmetricM
Lowest Common AncestorM
Lowest Common Ancestor With Parent PointersE
Sum root to leafE
Root to leaf path with specified sumM
Root to leaf path sum (All Paths)E
Inorder Traversal Without RecursionE
Preorder Traversal Without RecursionE
Kth Node in Inorder TraversalM
Compute SuccessorM
Inorder Traversal in Constant SpaceM
Preorder Traversal in Constant SpaceM
Postorder Traversal in Constant SpaceM
Reconstruct Binary TreeM
Reconstruct Binary TreeM
Reconstruct Binary Tree 2M
Form a LinkedList From Leaves Of Binary TreeM
Form a LinkedList From Leaves Of Binary Tree 2M
Compute Exterior of Binary TreeM
Compute Right Sibling Tree
-
E
Search Binary TreeE
Check If Binary Search Tree Satisfies BST PropertyE
Check If Binary Search Tree Satisfies BST Property - Solution 2E
Find the First Key Greater Than A Given Value In A BSTE
Find The K Largest Elements In A BSTE
Find The K Largest Elements In A BST - Solution 2E
Find The K Largest Elements In A BST - Solution 3M
Compute The LCA In A BSTM
Reconstruct A BST From Preorder Traversal DataM
Find The Closest Entries In Three Sorted ArraysM
Reconstruct A BST From Postorder Traversal DataM
Reconstruct A BST From Inorder Traversal DataM
Enumerate Numbers Of The Form a + b sqrt2M
Enumerate Numbers Of The Form a + b sqrt2 - Solution 2M
Build A Minimum Height BST From A Sorted ArrayM
Build A Minimum Height BST From A Sorted Array - Solution 2M
Test If Three BST Nodes Are Totally OrderedM
The Range Lookup ProblemM
Add Credits
-
E
Merge Two Sorted ListsE
Merge Two Sorted Doubly LinkedListM
Reverse A SublistM
Reverse A Sublist - Solution 2E
Reverse A Singly LinkedListM
Reverse Every K SublistE
Test For CyclicityM
Find The Start Of A Cycle In A LInkedListM
Find The Start Of A Cycle In A LInkedList - Solution 2E
Test For Overlapping List - Lists Are Cycle FreeM
Test For Overlapping List - Lists May Have CyclesE
Delete Node From Singly LinkedlistM
Remove Kth Last Element From ListE
Remove Duplicates From Sorted ListsM
Implement Cyclic Right Shift For Singly LinkedListM
Even Odd MergeE
Test If Singly LinkedList Is PalindromicM
Implement List PivotingM
Add Two LinkedLists
-
M
Validate Binary Search TreeE
Same TreeM
Binary Tree Level Order TraversalE
Maximum Depth of Binary TreeM
Construct Binary Tree from Preorder and Inorder TraversalH
Binary Tree Maximum Path SumE
Invert Binary TreeM
Kth Smallest Element in a BSTE
Lowest Common Ancestor of a Binary Search TreeH
Serialize and Deserialize Binary TreeE
Subtree of Another Tree
E
- Easy, M
- Medium , H
- Hard,
- Binary Trees
E
Binary Tree Inorder TraversalE
Same TreeE
Symmetric TreeE
Maximum Depth of Binary TreeE
Convert Sorted Array to Binary Search TreeE
Balanced Binary TreeE
Minimum Depth of Binary TreeE
Path SumE
Binary Tree Preorder TraversalE
Binary Tree Postorder TraversalE
Invert Binary TreeE
Lowest Common Ancestor of a Binary Search TreeE
Binary Tree PathsE
Sum of Left LeavesE
Find Mode in Binary Search TreeE
Minimum Absolute Difference in BSTE
Diameter of Binary TreeE
Binary Tree TiltE
Subtree of Another TreeE
Construct String from Binary TreeE
Merge Two Binary TreesE
Average of Levels in Binary TreeE
Two Sum IV - Input is a BSTE
Second Minimum Node In a Binary TreeE
Minimum Distance Between BST NodesM
Unique Binary Search Trees IIM
Unique Binary Search TreesM
Validate Binary Search TreeM
Recover Binary Search TreeM
Binary Tree Level Order TraversalM
Binary Tree Zigzag Level Order TraversalM
Construct Binary Tree from Preorder and Inorder TraversalM
Construct Binary Tree from Inorder and Postorder TraversalM
Binary Tree Level Order Traversal IIM
Path Sum IIM
Flatten Binary Tree to Linked ListM
Populating Next Right Pointers in Each NodeM
Populating Next Right Pointers in Each Node IIM
Sum Root to Leaf NumbersM
Binary Search Tree IteratorM
Binary Tree Right Side ViewM
Count Complete Tree NodesM
Kth Smallest Element in a BSTM
Lowest Common Ancestor of a Binary TreeM
House Robber IIIM
Path Sum IIIM
Serialize and Deserialize BSTM
Delete Node in a BSTM
Most Frequent Subtree SumM
Find Bottom Left Tree ValueM
Find Largest Value in Each Tree RowM
Convert BST to Greater TreeM
Add One Row to TreeM
Find Duplicate SubtreesM
Maximum Binary TreeM
Print Binary TreeM
Maximum Width of Binary TreeM
Trim a Binary Search TreeM
Longest Univalue PathM
All Nodes Distance K in Binary TreeM
Smallest String Starting From LeafM
Maximum Binary Tree IIM
Construct Binary Search Tree from Preorder TraversalH
Binary Tree Maximum Path SumH
Serialize and Deserialize Binary Tree
- LinkedLists
E
Merge Two Sorted ListsE
Remove Duplicates from Sorted List IE
Linked List CycleE
Intersection of Two Linked ListsE
Remove Linked List ElementsE
Reverse Linked ListE
Palindrome Linked ListM
Add Two NumbersM
Remove Nth Node From End of ListM
Swap Nodes in PairsM
Rotate ListM
Remove Duplicates from Sorted List IIM
Partition ListM
Reverse Linked List IIM
Convert Sorted List to Binary Search TreeM
Copy List with Random PointerM
Linked List Cycle IIM
Reorder ListM
Insertion Sort ListM
Sort ListM
Delete Node in a Linked ListM
Odd Even Linked ListM
Add Two Numbers IIM
Split Linked List in PartsH
Merge k Sorted ListsH
Reverse Nodes in k-Groups
A list of popular algorithms asked during Interviews
A simple crash course to get you up and started with recursion
▶ Data Structures and Algorithms on YouTube
Big O notation is used to classify algorithms according to how their running time or space requirements grow as the input size grows. On the chart below you may find most common orders of growth of algorithms specified in Big O notation.
Source: Big O Cheat Sheet.
Below is the list of some of the most used Big O notations and their performance comparisons against different sizes of the input data.
Big O Notation | Computations for 10 elements | Computations for 100 elements | Computations for 1000 elements |
---|---|---|---|
O(1) | 1 | 1 | 1 |
O(log N) | 3 | 6 | 9 |
O(N) | 10 | 100 | 1000 |
O(N log N) | 30 | 600 | 9000 |
O(N^2) | 100 | 10000 | 1000000 |
O(2^N) | 1024 | 1.26e+29 | 1.07e+301 |
O(N!) | 3628800 | 9.3e+157 | 4.02e+2567 |
Data Structure | Access | Search | Insertion | Deletion | Comments |
---|---|---|---|---|---|
Array | 1 | n | n | n | |
Stack | n | n | 1 | 1 | |
Queue | n | n | 1 | 1 | |
Linked List | n | n | 1 | n | |
Hash Table | - | n | n | n | In case of perfect hash function costs would be O(1) |
Binary Search Tree | n | n | n | n | In case of balanced tree costs would be O(log(n)) |
B-Tree | log(n) | log(n) | log(n) | log(n) | |
Red-Black Tree | log(n) | log(n) | log(n) | log(n) | |
AVL Tree | log(n) | log(n) | log(n) | log(n) | |
Bloom Filter | - | 1 | 1 | - | False positives are possible while searching |
Name | Best | Average | Worst | Memory | Stable | Comments |
---|---|---|---|---|---|---|
Bubble sort | n | n2 | n2 | 1 | Yes | |
Insertion sort | n | n2 | n2 | 1 | Yes | |
Selection sort | n2 | n2 | n2 | 1 | No | |
Heap sort | n log(n) | n log(n) | n log(n) | 1 | No | |
Merge sort | n log(n) | n log(n) | n log(n) | n | Yes | |
Quick sort | n log(n) | n log(n) | n2 | log(n) | No | Quicksort is usually done in-place with O(log(n)) stack space |
Shell sort | n log(n) | depends on gap sequence | n (log(n))2 | 1 | No | |
Counting sort | n + r | n + r | n + r | n + r | Yes | r - biggest number in array |
Radix sort | n * k | n * k | n * k | n + k | Yes | k - length of longest key |