@@ -125,6 +125,78 @@ public void RedBlackTree_Accuracy_Test()
125125 Assert . IsTrue ( tree . Count == 0 ) ;
126126 }
127127
128+ [ TestMethod ]
129+ public void RedBlack_Accuracy_Test_With_Node_LookUp ( )
130+ {
131+ var nodeCount = 1000 ;
132+
133+ var rnd = new Random ( ) ;
134+ var sorted = Enumerable . Range ( 1 , nodeCount ) . ToList ( ) ;
135+ var randomNumbers = sorted
136+ . OrderBy ( x => rnd . Next ( ) )
137+ . ToList ( ) ;
138+
139+ var tree = new RedBlackTree < int > ( true ) ;
140+
141+ for ( int i = 0 ; i < nodeCount ; i ++ )
142+ {
143+ var index = tree . Insert ( randomNumbers [ i ] ) ;
144+ Assert . AreEqual ( index , tree . IndexOf ( randomNumbers [ i ] ) ) ;
145+ Assert . IsTrue ( tree . HasItem ( randomNumbers [ i ] ) ) ;
146+ Assert . IsTrue ( tree . Root . IsBinarySearchTree ( int . MinValue , int . MaxValue ) ) ;
147+ tree . Root . VerifyCount ( ) ;
148+ var actualHeight = tree . Root . GetHeight ( ) ;
149+
150+ //http://doctrina.org/maximum-height-of-red-black-tree.html
151+ var maxHeight = 2 * Math . Log ( nodeCount + 1 , 2 ) ;
152+
153+ Assert . IsTrue ( actualHeight < maxHeight ) ;
154+ Assert . IsTrue ( tree . Count == i + 1 ) ;
155+ }
156+
157+ for ( int i = 0 ; i < sorted . Count ; i ++ )
158+ {
159+ Assert . AreEqual ( sorted [ i ] , tree . ElementAt ( i ) ) ;
160+ Assert . AreEqual ( i , tree . IndexOf ( sorted [ i ] ) ) ;
161+ }
162+
163+ //shuffle again before deletion tests
164+ randomNumbers = Enumerable . Range ( 1 , nodeCount )
165+ . OrderBy ( x => rnd . Next ( ) )
166+ . ToList ( ) ;
167+
168+ //IEnumerable test using linq
169+ Assert . AreEqual ( tree . Count , tree . Count ( ) ) ;
170+ Assert . AreEqual ( tree . Count , tree . AsEnumerableDesc ( ) . Count ( ) ) ;
171+
172+ for ( int i = 0 ; i < nodeCount ; i ++ )
173+ {
174+ if ( rnd . NextDouble ( ) >= 0.5 )
175+ {
176+ var index = tree . IndexOf ( randomNumbers [ i ] ) ;
177+ Assert . AreEqual ( index , tree . Delete ( randomNumbers [ i ] ) ) ;
178+ }
179+ else
180+ {
181+ var index = tree . IndexOf ( randomNumbers [ i ] ) ;
182+ Assert . AreEqual ( tree . ElementAt ( index ) , randomNumbers [ i ] ) ;
183+ tree . RemoveAt ( index ) ;
184+ }
185+
186+ Assert . IsTrue ( tree . Root . IsBinarySearchTree ( int . MinValue , int . MaxValue ) ) ;
187+ tree . Root . VerifyCount ( ) ;
188+ var actualHeight = tree . Root . GetHeight ( ) ;
189+
190+ //http://doctrina.org/maximum-height-of-red-black-tree.html
191+ var maxHeight = 2 * Math . Log ( nodeCount + 1 , 2 ) ;
192+
193+ Assert . IsTrue ( actualHeight < maxHeight ) ;
194+ Assert . IsTrue ( tree . Count == nodeCount - 1 - i ) ;
195+ }
196+
197+ Assert . IsTrue ( tree . Count == 0 ) ;
198+ }
199+
128200 [ TestMethod ]
129201 public void RedBlackTree_BulkInit_Test ( )
130202 {
@@ -162,6 +234,44 @@ public void RedBlackTree_BulkInit_Test()
162234 Assert . IsTrue ( tree . Count == 0 ) ;
163235 }
164236
237+
238+ [ TestMethod ]
239+ public void RedBlackTree_BulkInit_Test_With_Node_LookUp ( )
240+ {
241+ var nodeCount = 1000 ;
242+
243+ var rnd = new Random ( ) ;
244+ var sortedNumbers = Enumerable . Range ( 1 , nodeCount ) . ToList ( ) ;
245+
246+ var tree = new RedBlackTree < int > ( sortedNumbers , true ) ;
247+
248+ Assert . IsTrue ( tree . Root . IsBinarySearchTree ( int . MinValue , int . MaxValue ) ) ;
249+
250+ //IEnumerable test using linq
251+ Assert . AreEqual ( tree . Count , tree . Count ( ) ) ;
252+ Assert . AreEqual ( tree . Count , tree . AsEnumerableDesc ( ) . Count ( ) ) ;
253+
254+ tree . Root . VerifyCount ( ) ;
255+
256+ for ( int i = 0 ; i < nodeCount ; i ++ )
257+ {
258+ tree . Delete ( sortedNumbers [ i ] ) ;
259+
260+ tree . Root . VerifyCount ( ) ;
261+ Assert . IsTrue ( tree . Root . IsBinarySearchTree ( int . MinValue , int . MaxValue ) ) ;
262+
263+ var actualHeight = tree . Root . GetHeight ( ) ;
264+
265+ //http://doctrina.org/maximum-height-of-red-black-tree.html
266+ var maxHeight = 2 * Math . Log ( nodeCount + 1 , 2 ) ;
267+
268+ Assert . IsTrue ( actualHeight < maxHeight ) ;
269+ Assert . IsTrue ( tree . Count == nodeCount - 1 - i ) ;
270+ }
271+
272+ Assert . IsTrue ( tree . Count == 0 ) ;
273+ }
274+
165275 [ TestMethod ]
166276 public void RedBlackTree_StressTest ( )
167277 {
0 commit comments