A curated collection of Data Structures and Algorithms implemented in Rust, focused on clarity, correctness, and performance.

Solve 23/75

+12 -7
README.md
··· 15 15 16 16 #### Array & Hashing 17 17 18 - - [ ] Contains Duplicate 18 + - [x] Contains Duplicate 19 19 [[#217]](https://leetcode.com/problems/contains-duplicate/) 20 + [src/array_hashing/contains_duplicate.rs](src/array_hashing/contains_duplicate.rs) 20 21 - [x] Valid Anagram 21 22 [[#242]](https://leetcode.com/problems/valid-anagram/) 22 - src/array_hashing/is_anagram.rs 23 + [src/array_hashing/is_anagram.rs](src/array_hashing/is_anagram.rs) 23 24 - [x] Two Sum 24 25 [[#1]](https://leetcode.com/problems/two-sum/) 25 - src/array_hashing/two_sum.rs 26 - - [ ] Group Anagrams 26 + [src/array_hashing/two_sum.rs](src/array_hashing/two_sum.rs) 27 + - [x] Group Anagrams 27 28 [[#49]](https://leetcode.com/problems/group-anagrams/) 29 + [src/array_hashing/group_anagrams.rs](src/array_hashing/group_anagrams.rs) 28 30 - [ ] Top K Frequent Elements 29 31 [[#347]](https://leetcode.com/problems/top-k-frequent-elements/) 30 32 - [ ] Encode and Decode Strings ··· 100 102 101 103 #### Trees 102 104 103 - - [ ] Invert Binary Tree 105 + - [x] Invert Binary Tree 104 106 [[#226]](https://leetcode.com/problems/invert-binary-tree/) 105 - - [ ] Maximum Depth of Binary Tree 107 + src/trees/invert_tree.rs 108 + - [x] Maximum Depth of Binary Tree 106 109 [[#104]](https://leetcode.com/problems/maximum-depth-of-binary-tree/) 107 - - [ ] Same Tree 110 + src/trees/max_depth.rs 111 + - [x] Same Tree 108 112 [[#100]](https://leetcode.com/problems/same-tree/) 113 + src/trees/is_same_tree.rs 109 114 - [ ] Subtree of Another Tree 110 115 [[#572]](https://leetcode.com/problems/subtree-of-another-tree/) 111 116 - [ ] Lowest Common Ancestor of a Binary Search Tree
+24
src/array_hashing/contains_duplicate.rs
··· 1 + use std::collections::HashSet; 2 + 3 + pub fn contains_duplicate(nums: Vec<i32>) -> bool { 4 + let mut hash = HashSet::new(); 5 + for num in nums { 6 + if hash.contains(&num) { 7 + return true; 8 + } 9 + hash.insert(num); 10 + } 11 + return false; 12 + } 13 + 14 + #[cfg(test)] 15 + mod tests { 16 + use crate::array_hashing::contains_duplicate::contains_duplicate; 17 + 18 + #[test] 19 + fn case_1() { 20 + assert_eq!(contains_duplicate(vec![1, 2, 3, 1]), true); 21 + assert_eq!(contains_duplicate(vec![1, 2, 3, 4]), false); 22 + assert_eq!(contains_duplicate(vec![1, 1, 1, 3, 3, 4, 3, 2, 4, 2]), true); 23 + } 24 + }
+50
src/array_hashing/group_anagrams.rs
··· 1 + use std::collections::HashMap; 2 + 3 + pub fn group_anagrams(strs: Vec<String>) -> Vec<Vec<String>> { 4 + let mut map: HashMap<[u8; 26], Vec<String>> = HashMap::with_capacity(strs.len()); 5 + 6 + for s in strs { 7 + let mut key = [0u8; 26]; 8 + for b in s.as_bytes() { 9 + unsafe { 10 + *key.get_unchecked_mut((b - b'a') as usize) += 1; 11 + } 12 + } 13 + map.entry(key).or_default().push(s); 14 + } 15 + 16 + map.into_values().collect() 17 + } 18 + 19 + #[cfg(test)] 20 + mod tests { 21 + use crate::array_hashing::group_anagrams::group_anagrams; 22 + 23 + fn sort_anagram_groups(groups: Vec<Vec<String>>) -> Vec<Vec<String>> { 24 + let mut groups = groups; 25 + for group in groups.iter_mut() { 26 + group.sort(); 27 + } 28 + groups.sort_by(|a, b| a[0].cmp(&b[0])); 29 + groups 30 + } 31 + 32 + #[test] 33 + fn case_1() { 34 + assert_eq!( 35 + sort_anagram_groups(group_anagrams(vec![ 36 + "eat".to_string(), 37 + "tea".to_string(), 38 + "tan".to_string(), 39 + "ate".to_string(), 40 + "nat".to_string(), 41 + "bat".to_string() 42 + ])), 43 + sort_anagram_groups(vec![ 44 + vec!["bat".to_string()], 45 + vec!["nat".to_string(), "tan".to_string()], 46 + vec!["ate".to_string(), "eat".to_string(), "tea".to_string()] 47 + ]) 48 + ); 49 + } 50 + }
+2
src/array_hashing/mod.rs
··· 1 + pub mod contains_duplicate; 2 + pub mod group_anagrams; 1 3 pub mod is_anagram; 2 4 pub mod two_sum;
+1
src/lib.rs
··· 3 3 pub mod linked_list; 4 4 pub mod sliding_window; 5 5 pub mod stack; 6 + pub mod trees; 6 7 pub mod two_pointers;
+105
src/trees/invert_tree.rs
··· 1 + use std::cell::RefCell; 2 + use std::rc::Rc; 3 + 4 + use crate::trees::TreeNode; 5 + 6 + pub fn invert_tree(root: Option<Rc<RefCell<TreeNode>>>) -> Option<Rc<RefCell<TreeNode>>> { 7 + if let Some(node) = root.as_ref() { 8 + let mut node_borrow = node.borrow_mut(); 9 + 10 + let left = node_borrow.left.take(); 11 + let right = node_borrow.right.take(); 12 + 13 + node_borrow.left = invert_tree(right); 14 + node_borrow.right = invert_tree(left); 15 + } 16 + 17 + root 18 + } 19 + 20 + #[cfg(test)] 21 + mod tests { 22 + use super::*; 23 + 24 + // Helper function to create a node wrapped in Rc/RefCell 25 + fn create_node(val: i32) -> Option<Rc<RefCell<TreeNode>>> { 26 + Some(Rc::new(RefCell::new(TreeNode::new(val)))) 27 + } 28 + 29 + #[test] 30 + fn test_empty_tree() { 31 + assert_eq!(invert_tree(None), None); 32 + } 33 + 34 + #[test] 35 + fn test_single_node() { 36 + let root = create_node(1); 37 + let result = invert_tree(root.clone()); 38 + assert_eq!(result, root); 39 + } 40 + 41 + #[test] 42 + fn test_simple_inversion() { 43 + /* 44 + Original: Inverted: 45 + 1 1 46 + / \ / \ 47 + 2 3 3 2 48 + */ 49 + let root = create_node(1); 50 + let left = create_node(2); 51 + let right = create_node(3); 52 + 53 + root.as_ref().unwrap().borrow_mut().left = left; 54 + root.as_ref().unwrap().borrow_mut().right = right; 55 + 56 + let inverted = invert_tree(root); 57 + let binding = inverted.unwrap(); 58 + let result_node = binding.borrow(); 59 + 60 + assert_eq!(result_node.val, 1); 61 + assert_eq!(result_node.left.as_ref().unwrap().borrow().val, 3); 62 + assert_eq!(result_node.right.as_ref().unwrap().borrow().val, 2); 63 + } 64 + 65 + #[test] 66 + fn test_complex_tree() { 67 + /* 68 + Original: Inverted: 69 + 4 4 70 + / \ / \ 71 + 2 7 7 2 72 + / \ / \ / \ / \ 73 + 1 3 6 9 9 6 3 1 74 + */ 75 + let root = create_node(4); 76 + 77 + // Left subtree 78 + let n2 = create_node(2); 79 + n2.as_ref().unwrap().borrow_mut().left = create_node(1); 80 + n2.as_ref().unwrap().borrow_mut().right = create_node(3); 81 + 82 + // Right subtree 83 + let n7 = create_node(7); 84 + n7.as_ref().unwrap().borrow_mut().left = create_node(6); 85 + n7.as_ref().unwrap().borrow_mut().right = create_node(9); 86 + 87 + root.as_ref().unwrap().borrow_mut().left = n2; 88 + root.as_ref().unwrap().borrow_mut().right = n7; 89 + 90 + let inverted_root = invert_tree(root).unwrap(); 91 + let root_borrow = inverted_root.borrow(); 92 + 93 + // Check level 1 94 + let left_child = root_borrow.left.as_ref().unwrap().borrow(); 95 + let right_child = root_borrow.right.as_ref().unwrap().borrow(); 96 + assert_eq!(left_child.val, 7); 97 + assert_eq!(right_child.val, 2); 98 + 99 + // Check level 2 (deepest nodes) 100 + assert_eq!(left_child.left.as_ref().unwrap().borrow().val, 9); 101 + assert_eq!(left_child.right.as_ref().unwrap().borrow().val, 6); 102 + assert_eq!(right_child.left.as_ref().unwrap().borrow().val, 3); 103 + assert_eq!(right_child.right.as_ref().unwrap().borrow().val, 1); 104 + } 105 + }
+65
src/trees/is_same_tree.rs
··· 1 + use std::{cell::RefCell, rc::Rc}; 2 + 3 + use crate::trees::TreeNode; 4 + 5 + pub fn is_same_tree(p: Option<Rc<RefCell<TreeNode>>>, q: Option<Rc<RefCell<TreeNode>>>) -> bool { 6 + match (p, q) { 7 + (None, None) => true, 8 + 9 + (Some(p_node), Some(q_node)) => { 10 + let p_ref = p_node.borrow(); 11 + let q_ref = q_node.borrow(); 12 + 13 + p_ref.val == q_ref.val 14 + && is_same_tree(p_ref.left.clone(), q_ref.left.clone()) 15 + && is_same_tree(p_ref.right.clone(), q_ref.right.clone()) 16 + } 17 + 18 + _ => false, 19 + } 20 + } 21 + 22 + #[cfg(test)] 23 + mod tests { 24 + use super::*; 25 + 26 + fn node( 27 + val: i32, 28 + left: Option<Rc<RefCell<TreeNode>>>, 29 + right: Option<Rc<RefCell<TreeNode>>>, 30 + ) -> Option<Rc<RefCell<TreeNode>>> { 31 + Some(Rc::new(RefCell::new(TreeNode { val, left, right }))) 32 + } 33 + 34 + #[test] 35 + fn test_identical_trees() { 36 + // Tree p: [1, 2, 3] 37 + let p = node(1, node(2, None, None), node(3, None, None)); 38 + // Tree q: [1, 2, 3] 39 + let q = node(1, node(2, None, None), node(3, None, None)); 40 + assert!(is_same_tree(p, q)); 41 + } 42 + 43 + #[test] 44 + fn test_different_structure() { 45 + // Tree p: [1, 2] 46 + let p = node(1, node(2, None, None), None); 47 + // Tree q: [1, null, 2] 48 + let q = node(1, None, node(2, None, None)); 49 + assert!(!is_same_tree(p, q)); 50 + } 51 + 52 + #[test] 53 + fn test_different_values() { 54 + // Tree p: [1, 2, 1] 55 + let p = node(1, node(2, None, None), node(1, None, None)); 56 + // Tree q: [1, 1, 2] 57 + let q = node(1, node(1, None, None), node(2, None, None)); 58 + assert!(!is_same_tree(p, q)); 59 + } 60 + 61 + #[test] 62 + fn test_empty_trees() { 63 + assert!(is_same_tree(None, None)); 64 + } 65 + }
+157
src/trees/max_depth.rs
··· 1 + use std::collections::VecDeque; 2 + use std::{cell::RefCell, rc::Rc}; 3 + 4 + use crate::trees::TreeNode; 5 + 6 + // iterative approach BFS 7 + pub fn max_depth_tabulation_bfs(root: Option<Rc<RefCell<TreeNode>>>) -> i32 { 8 + let root = match root { 9 + None => return 0, 10 + Some(node) => node, 11 + }; 12 + 13 + let mut queue = VecDeque::new(); 14 + queue.push_back(root); 15 + let mut depth = 0; 16 + 17 + while !queue.is_empty() { 18 + depth += 1; 19 + 20 + let level_size = queue.len(); 21 + 22 + for _ in 0..level_size { 23 + if let Some(node) = queue.pop_front() { 24 + let node_ref = node.borrow(); 25 + 26 + if let Some(left) = node_ref.left.clone() { 27 + queue.push_back(left); 28 + } 29 + if let Some(right) = node_ref.right.clone() { 30 + queue.push_back(right); 31 + } 32 + } 33 + } 34 + } 35 + 36 + depth 37 + } 38 + 39 + pub fn max_depth_tabulation_dfs(root: Option<Rc<RefCell<TreeNode>>>) -> i32 { 40 + let root_node = match root { 41 + None => return 0, 42 + Some(node) => node, 43 + }; 44 + 45 + let mut max_depth = 0; 46 + let mut stack = vec![(root_node, 1)]; 47 + 48 + while let Some((node, current_depth)) = stack.pop() { 49 + max_depth = max_depth.max(current_depth); 50 + 51 + let node_ref = node.borrow(); 52 + 53 + if let Some(right) = node_ref.right.clone() { 54 + stack.push((right, current_depth + 1)); 55 + } 56 + if let Some(left) = node_ref.left.clone() { 57 + stack.push((left, current_depth + 1)); 58 + } 59 + } 60 + 61 + max_depth 62 + } 63 + 64 + pub fn max_depth(root: Option<Rc<RefCell<TreeNode>>>) -> i32 { 65 + match root { 66 + None => 0, 67 + Some(node) => { 68 + let node_ref = node.borrow(); 69 + let left_depth = max_depth(node_ref.left.clone()); 70 + let right_depth = max_depth(node_ref.right.clone()); 71 + 1 + left_depth.max(right_depth) 72 + } 73 + } 74 + } 75 + 76 + #[cfg(test)] 77 + mod tests { 78 + use super::*; 79 + use std::collections::VecDeque; 80 + 81 + // Helper function to build a tree from a LeetCode-style vector 82 + fn to_tree(elements: Vec<Option<i32>>) -> Option<Rc<RefCell<TreeNode>>> { 83 + if elements.is_empty() || elements[0].is_none() { 84 + return None; 85 + } 86 + 87 + let root = Rc::new(RefCell::new(TreeNode::new(elements[0].unwrap()))); 88 + let mut queue = VecDeque::new(); 89 + queue.push_back(Rc::clone(&root)); 90 + 91 + let mut i = 1; 92 + while i < elements.len() { 93 + if let Some(node) = queue.pop_front() { 94 + // Left Child 95 + if i < elements.len() { 96 + if let Some(val) = elements[i] { 97 + let left_node = Rc::new(RefCell::new(TreeNode::new(val))); 98 + node.borrow_mut().left = Some(Rc::clone(&left_node)); 99 + queue.push_back(left_node); 100 + } 101 + i += 1; 102 + } 103 + // Right Child 104 + if i < elements.len() { 105 + if let Some(val) = elements[i] { 106 + let right_node = Rc::new(RefCell::new(TreeNode::new(val))); 107 + node.borrow_mut().right = Some(Rc::clone(&right_node)); 108 + queue.push_back(right_node); 109 + } 110 + i += 1; 111 + } 112 + } 113 + } 114 + Some(root) 115 + } 116 + 117 + #[test] 118 + fn test_example_1() { 119 + // root = [3,9,20,null,null,15,7] 120 + let root = to_tree(vec![ 121 + Some(3), 122 + Some(9), 123 + Some(20), 124 + None, 125 + None, 126 + Some(15), 127 + Some(7), 128 + ]); 129 + assert_eq!(max_depth(root), 3); 130 + } 131 + 132 + #[test] 133 + fn test_example_2() { 134 + // root = [1,null,2] 135 + let root = to_tree(vec![Some(1), None, Some(2)]); 136 + assert_eq!(max_depth(root), 2); 137 + } 138 + 139 + #[test] 140 + fn test_empty_tree() { 141 + let root = to_tree(vec![]); 142 + assert_eq!(max_depth(root), 0); 143 + } 144 + 145 + #[test] 146 + fn test_single_node() { 147 + let root = to_tree(vec![Some(1)]); 148 + assert_eq!(max_depth(root), 1); 149 + } 150 + 151 + #[test] 152 + fn test_skewed_tree() { 153 + // 1 -> 2 -> 3 -> 4 (all left) 154 + let root = to_tree(vec![Some(1), Some(2), None, Some(3), None, Some(4)]); 155 + assert_eq!(max_depth(root), 4); 156 + } 157 + }
+23
src/trees/mod.rs
··· 1 + use std::{cell::RefCell, rc::Rc}; 2 + 3 + #[derive(Debug, PartialEq, Eq)] 4 + pub struct TreeNode { 5 + pub val: i32, 6 + pub left: Option<Rc<RefCell<TreeNode>>>, 7 + pub right: Option<Rc<RefCell<TreeNode>>>, 8 + } 9 + 10 + impl TreeNode { 11 + #[inline] 12 + pub fn new(val: i32) -> Self { 13 + TreeNode { 14 + val, 15 + left: None, 16 + right: None, 17 + } 18 + } 19 + } 20 + 21 + pub mod invert_tree; 22 + pub mod is_same_tree; 23 + pub mod max_depth;