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
71use std:: cmp:: Ordering ;
82use std:: fmt:: Debug ;
93
10-
114#[ derive( Debug ) ]
125struct TreeNode < T >
136where
@@ -43,20 +36,28 @@ impl<T> BinarySearchTree<T>
4336where
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) ]
75113mod 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