Skip to content

Commit c59d685

Browse files
author
build
committed
feat:exercises
1 parent c96c111 commit c59d685

File tree

1 file changed

+53
-24
lines changed

1 file changed

+53
-24
lines changed

exercises/algorithm/algorithm4.rs

Lines changed: 53 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
1-
/*
2-
binary_search tree
3-
This problem requires you to implement a basic interface for a binary tree
4-
*/
5-
6-
//I AM NOT DONE
71
use std::cmp::Ordering;
82
use std::fmt::Debug;
93

10-
114
#[derive(Debug)]
125
struct TreeNode<T>
136
where
@@ -43,20 +36,28 @@ impl<T> BinarySearchTree<T>
4336
where
4437
T: Ord,
4538
{
46-
4739
fn new() -> Self {
4840
BinarySearchTree { root: None }
4941
}
5042

5143
// Insert a value into the BST
5244
fn insert(&mut self, value: T) {
53-
//TODO
45+
match &mut self.root {
46+
Some(node) => {
47+
node.insert(value);
48+
}
49+
None => {
50+
self.root = Some(Box::new(TreeNode::new(value)));
51+
}
52+
}
5453
}
5554

5655
// Search for a value in the BST
5756
fn search(&self, value: T) -> bool {
58-
//TODO
59-
true
57+
match &self.root {
58+
Some(node) => node.search(value),
59+
None => false,
60+
}
6061
}
6162
}
6263

@@ -66,10 +67,47 @@ where
6667
{
6768
// Insert a node into the tree
6869
fn insert(&mut self, value: T) {
69-
//TODO
70+
match value.cmp(&self.value) {
71+
Ordering::Less => {
72+
match &mut self.left {
73+
Some(left_node) => {
74+
left_node.insert(value);
75+
}
76+
None => {
77+
self.left = Some(Box::new(TreeNode::new(value)));
78+
}
79+
}
80+
}
81+
Ordering::Greater => {
82+
match &mut self.right {
83+
Some(right_node) => {
84+
right_node.insert(value);
85+
}
86+
None => {
87+
self.right = Some(Box::new(TreeNode::new(value)));
88+
}
89+
}
90+
}
91+
Ordering::Equal => {
92+
}
93+
}
7094
}
71-
}
7295

96+
// Search for a value in the tree
97+
fn search(&self, value: T) -> bool {
98+
match value.cmp(&self.value) {
99+
Ordering::Less => match &self.left {
100+
Some(left_node) => left_node.search(value),
101+
None => false,
102+
},
103+
Ordering::Greater => match &self.right {
104+
Some(right_node) => right_node.search(value),
105+
None => false,
106+
},
107+
Ordering::Equal => true,
108+
}
109+
}
110+
}
73111

74112
#[cfg(test)]
75113
mod tests {
@@ -79,24 +117,20 @@ mod tests {
79117
fn test_insert_and_search() {
80118
let mut bst = BinarySearchTree::new();
81119

82-
83120
assert_eq!(bst.search(1), false);
84121

85-
86122
bst.insert(5);
87123
bst.insert(3);
88124
bst.insert(7);
89125
bst.insert(2);
90126
bst.insert(4);
91127

92-
93128
assert_eq!(bst.search(5), true);
94129
assert_eq!(bst.search(3), true);
95130
assert_eq!(bst.search(7), true);
96131
assert_eq!(bst.search(2), true);
97132
assert_eq!(bst.search(4), true);
98133

99-
100134
assert_eq!(bst.search(1), false);
101135
assert_eq!(bst.search(6), false);
102136
}
@@ -105,22 +139,17 @@ mod tests {
105139
fn test_insert_duplicate() {
106140
let mut bst = BinarySearchTree::new();
107141

108-
109142
bst.insert(1);
110143
bst.insert(1);
111144

112-
113145
assert_eq!(bst.search(1), true);
114146

115-
116147
match bst.root {
117148
Some(ref node) => {
118149
assert!(node.left.is_none());
119150
assert!(node.right.is_none());
120-
},
151+
}
121152
None => panic!("Root should not be None after insertion"),
122153
}
123154
}
124-
}
125-
126-
155+
}

0 commit comments

Comments
 (0)