Skip to content

Commit 2fe4071

Browse files
04121628
1 parent 49a8dc1 commit 2fe4071

File tree

1 file changed

+35
-24
lines changed

1 file changed

+35
-24
lines changed

exercises/algorithm/algorithm4.rs

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
/*
2-
binary_search tree
3-
This problem requires you to implement a basic interface for a binary tree
2+
binary_search tree
3+
This problem requires you to implement a basic interface for a binary tree
44
*/
55

66
//I AM NOT DONE
7+
78
use std::cmp::Ordering;
89
use std::fmt::Debug;
910

10-
1111
#[derive(Debug)]
1212
struct TreeNode<T>
1313
where
@@ -43,33 +43,53 @@ impl<T> BinarySearchTree<T>
4343
where
4444
T: Ord,
4545
{
46-
4746
fn new() -> Self {
4847
BinarySearchTree { root: None }
4948
}
50-
51-
// Insert a value into the BST
5249
fn insert(&mut self, value: T) {
53-
//TODO
50+
match self.root {
51+
Some(ref mut node) => node.insert(value),
52+
None => self.root = Some(Box::new(TreeNode::new(value))),
53+
}
5454
}
5555

56-
// Search for a value in the BST
5756
fn search(&self, value: T) -> bool {
58-
//TODO
59-
true
57+
self.root.as_ref().map_or(false, |node| node.search(&value))
6058
}
6159
}
6260

6361
impl<T> TreeNode<T>
6462
where
6563
T: Ord,
6664
{
67-
// Insert a node into the tree
6865
fn insert(&mut self, value: T) {
69-
//TODO
66+
match value.cmp(&self.value) {
67+
Ordering::Less => {
68+
if let Some(ref mut left) = self.left {
69+
left.insert(value);
70+
} else {
71+
self.left = Some(Box::new(TreeNode::new(value)));
72+
}
73+
}
74+
Ordering::Greater => {
75+
if let Some(ref mut right) = self.right {
76+
right.insert(value);
77+
} else {
78+
self.right = Some(Box::new(TreeNode::new(value)));
79+
}
80+
}
81+
Ordering::Equal => {} // Do nothing for duplicates
82+
}
7083
}
71-
}
7284

85+
fn search(&self, value: &T) -> bool {
86+
match value.cmp(&self.value) {
87+
Ordering::Less => self.left.as_ref().map_or(false, |node| node.search(value)),
88+
Ordering::Greater => self.right.as_ref().map_or(false, |node| node.search(value)),
89+
Ordering::Equal => true,
90+
}
91+
}
92+
}
7393

7494
#[cfg(test)]
7595
mod tests {
@@ -79,24 +99,20 @@ mod tests {
7999
fn test_insert_and_search() {
80100
let mut bst = BinarySearchTree::new();
81101

82-
83102
assert_eq!(bst.search(1), false);
84103

85-
86104
bst.insert(5);
87105
bst.insert(3);
88106
bst.insert(7);
89107
bst.insert(2);
90108
bst.insert(4);
91109

92-
93110
assert_eq!(bst.search(5), true);
94111
assert_eq!(bst.search(3), true);
95112
assert_eq!(bst.search(7), true);
96113
assert_eq!(bst.search(2), true);
97114
assert_eq!(bst.search(4), true);
98115

99-
100116
assert_eq!(bst.search(1), false);
101117
assert_eq!(bst.search(6), false);
102118
}
@@ -105,22 +121,17 @@ mod tests {
105121
fn test_insert_duplicate() {
106122
let mut bst = BinarySearchTree::new();
107123

108-
109124
bst.insert(1);
110125
bst.insert(1);
111126

112-
113127
assert_eq!(bst.search(1), true);
114128

115-
116129
match bst.root {
117130
Some(ref node) => {
118131
assert!(node.left.is_none());
119132
assert!(node.right.is_none());
120-
},
133+
}
121134
None => panic!("Root should not be None after insertion"),
122135
}
123136
}
124-
}
125-
126-
137+
}

0 commit comments

Comments
 (0)