+12
-7
README.md
+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
+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
+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
+2
src/array_hashing/mod.rs
+1
src/lib.rs
+1
src/lib.rs
+105
src/trees/invert_tree.rs
+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
+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
+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
+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;