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
BLinked ListBCircular Linked ListBDoubly Linked ListBCircular Doubly Linked ListBQueueBPriority QueueBStackBHash TableAHeapATrieATreeAGraphs
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.
-
EBinary Tree TraversalEIs Binary Tree Height BalancedEIs Binary Tree SymmetricMLowest Common AncestorMLowest Common Ancestor With Parent PointersESum root to leafERoot to leaf path with specified sumMRoot to leaf path sum (All Paths)EInorder Traversal Without RecursionEPreorder Traversal Without RecursionEKth Node in Inorder TraversalMCompute SuccessorMInorder Traversal in Constant SpaceMPreorder Traversal in Constant SpaceMPostorder Traversal in Constant SpaceMReconstruct Binary TreeMReconstruct Binary TreeMReconstruct Binary Tree 2MForm a LinkedList From Leaves Of Binary TreeMForm a LinkedList From Leaves Of Binary Tree 2MCompute Exterior of Binary TreeMCompute Right Sibling Tree
-
ESearch Binary TreeECheck If Binary Search Tree Satisfies BST PropertyECheck If Binary Search Tree Satisfies BST Property - Solution 2EFind the First Key Greater Than A Given Value In A BSTEFind The K Largest Elements In A BSTEFind The K Largest Elements In A BST - Solution 2EFind The K Largest Elements In A BST - Solution 3MCompute The LCA In A BSTMReconstruct A BST From Preorder Traversal DataMFind The Closest Entries In Three Sorted ArraysMReconstruct A BST From Postorder Traversal DataMReconstruct A BST From Inorder Traversal DataMEnumerate Numbers Of The Form a + b sqrt2MEnumerate Numbers Of The Form a + b sqrt2 - Solution 2MBuild A Minimum Height BST From A Sorted ArrayMBuild A Minimum Height BST From A Sorted Array - Solution 2MTest If Three BST Nodes Are Totally OrderedMThe Range Lookup ProblemMAdd Credits
-
EMerge Two Sorted ListsEMerge Two Sorted Doubly LinkedListMReverse A SublistMReverse A Sublist - Solution 2EReverse A Singly LinkedListMReverse Every K SublistETest For CyclicityMFind The Start Of A Cycle In A LInkedListMFind The Start Of A Cycle In A LInkedList - Solution 2ETest For Overlapping List - Lists Are Cycle FreeMTest For Overlapping List - Lists May Have CyclesEDelete Node From Singly LinkedlistMRemove Kth Last Element From ListERemove Duplicates From Sorted ListsMImplement Cyclic Right Shift For Singly LinkedListMEven Odd MergeETest If Singly LinkedList Is PalindromicMImplement List PivotingMAdd Two LinkedLists
-
MValidate Binary Search TreeESame TreeMBinary Tree Level Order TraversalEMaximum Depth of Binary TreeMConstruct Binary Tree from Preorder and Inorder TraversalHBinary Tree Maximum Path SumEInvert Binary TreeMKth Smallest Element in a BSTELowest Common Ancestor of a Binary Search TreeHSerialize and Deserialize Binary TreeESubtree of Another Tree
E - Easy, M - Medium , H - Hard,
- Binary Trees
EBinary Tree Inorder TraversalESame TreeESymmetric TreeEMaximum Depth of Binary TreeEConvert Sorted Array to Binary Search TreeEBalanced Binary TreeEMinimum Depth of Binary TreeEPath SumEBinary Tree Preorder TraversalEBinary Tree Postorder TraversalEInvert Binary TreeELowest Common Ancestor of a Binary Search TreeEBinary Tree PathsESum of Left LeavesEFind Mode in Binary Search TreeEMinimum Absolute Difference in BSTEDiameter of Binary TreeEBinary Tree TiltESubtree of Another TreeEConstruct String from Binary TreeEMerge Two Binary TreesEAverage of Levels in Binary TreeETwo Sum IV - Input is a BSTESecond Minimum Node In a Binary TreeEMinimum Distance Between BST NodesMUnique Binary Search Trees IIMUnique Binary Search TreesMValidate Binary Search TreeMRecover Binary Search TreeMBinary Tree Level Order TraversalMBinary Tree Zigzag Level Order TraversalMConstruct Binary Tree from Preorder and Inorder TraversalMConstruct Binary Tree from Inorder and Postorder TraversalMBinary Tree Level Order Traversal IIMPath Sum IIMFlatten Binary Tree to Linked ListMPopulating Next Right Pointers in Each NodeMPopulating Next Right Pointers in Each Node IIMSum Root to Leaf NumbersMBinary Search Tree IteratorMBinary Tree Right Side ViewMCount Complete Tree NodesMKth Smallest Element in a BSTMLowest Common Ancestor of a Binary TreeMHouse Robber IIIMPath Sum IIIMSerialize and Deserialize BSTMDelete Node in a BSTMMost Frequent Subtree SumMFind Bottom Left Tree ValueMFind Largest Value in Each Tree RowMConvert BST to Greater TreeMAdd One Row to TreeMFind Duplicate SubtreesMMaximum Binary TreeMPrint Binary TreeMMaximum Width of Binary TreeMTrim a Binary Search TreeMLongest Univalue PathMAll Nodes Distance K in Binary TreeMSmallest String Starting From LeafMMaximum Binary Tree IIMConstruct Binary Search Tree from Preorder TraversalHBinary Tree Maximum Path SumHSerialize and Deserialize Binary Tree
- LinkedLists
EMerge Two Sorted ListsERemove Duplicates from Sorted List IELinked List CycleEIntersection of Two Linked ListsERemove Linked List ElementsEReverse Linked ListEPalindrome Linked ListMAdd Two NumbersMRemove Nth Node From End of ListMSwap Nodes in PairsMRotate ListMRemove Duplicates from Sorted List IIMPartition ListMReverse Linked List IIMConvert Sorted List to Binary Search TreeMCopy List with Random PointerMLinked List Cycle IIMReorder ListMInsertion Sort ListMSort ListMDelete Node in a Linked ListMOdd Even Linked ListMAdd Two Numbers IIMSplit Linked List in PartsHMerge k Sorted ListsHReverse 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 |
