1
1
/*
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
4
4
*/
5
5
6
6
//I AM NOT DONE
7
+
7
8
use std:: cmp:: Ordering ;
8
9
use std:: fmt:: Debug ;
9
10
10
-
11
11
#[ derive( Debug ) ]
12
12
struct TreeNode < T >
13
13
where
@@ -43,33 +43,53 @@ impl<T> BinarySearchTree<T>
43
43
where
44
44
T : Ord ,
45
45
{
46
-
47
46
fn new ( ) -> Self {
48
47
BinarySearchTree { root : None }
49
48
}
50
-
51
- // Insert a value into the BST
52
49
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
+ }
54
54
}
55
55
56
- // Search for a value in the BST
57
56
fn search ( & self , value : T ) -> bool {
58
- //TODO
59
- true
57
+ self . root . as_ref ( ) . map_or ( false , |node| node. search ( & value) )
60
58
}
61
59
}
62
60
63
61
impl < T > TreeNode < T >
64
62
where
65
63
T : Ord ,
66
64
{
67
- // Insert a node into the tree
68
65
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
+ }
70
83
}
71
- }
72
84
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
+ }
73
93
74
94
#[ cfg( test) ]
75
95
mod tests {
@@ -79,24 +99,20 @@ mod tests {
79
99
fn test_insert_and_search ( ) {
80
100
let mut bst = BinarySearchTree :: new ( ) ;
81
101
82
-
83
102
assert_eq ! ( bst. search( 1 ) , false ) ;
84
103
85
-
86
104
bst. insert ( 5 ) ;
87
105
bst. insert ( 3 ) ;
88
106
bst. insert ( 7 ) ;
89
107
bst. insert ( 2 ) ;
90
108
bst. insert ( 4 ) ;
91
109
92
-
93
110
assert_eq ! ( bst. search( 5 ) , true ) ;
94
111
assert_eq ! ( bst. search( 3 ) , true ) ;
95
112
assert_eq ! ( bst. search( 7 ) , true ) ;
96
113
assert_eq ! ( bst. search( 2 ) , true ) ;
97
114
assert_eq ! ( bst. search( 4 ) , true ) ;
98
115
99
-
100
116
assert_eq ! ( bst. search( 1 ) , false ) ;
101
117
assert_eq ! ( bst. search( 6 ) , false ) ;
102
118
}
@@ -105,22 +121,17 @@ mod tests {
105
121
fn test_insert_duplicate ( ) {
106
122
let mut bst = BinarySearchTree :: new ( ) ;
107
123
108
-
109
124
bst. insert ( 1 ) ;
110
125
bst. insert ( 1 ) ;
111
126
112
-
113
127
assert_eq ! ( bst. search( 1 ) , true ) ;
114
128
115
-
116
129
match bst. root {
117
130
Some ( ref node) => {
118
131
assert ! ( node. left. is_none( ) ) ;
119
132
assert ! ( node. right. is_none( ) ) ;
120
- } ,
133
+ }
121
134
None => panic ! ( "Root should not be None after insertion" ) ,
122
135
}
123
136
}
124
- }
125
-
126
-
137
+ }
0 commit comments