@@ -125,6 +125,78 @@ public void RedBlackTree_Accuracy_Test()
125
125
Assert . IsTrue ( tree . Count == 0 ) ;
126
126
}
127
127
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
+
128
200
[ TestMethod ]
129
201
public void RedBlackTree_BulkInit_Test ( )
130
202
{
@@ -162,6 +234,44 @@ public void RedBlackTree_BulkInit_Test()
162
234
Assert . IsTrue ( tree . Count == 0 ) ;
163
235
}
164
236
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
+
165
275
[ TestMethod ]
166
276
public void RedBlackTree_StressTest ( )
167
277
{
0 commit comments