1
1
using System ;
2
+ using System . Linq ;
2
3
using System . Collections . Generic ;
3
4
4
5
namespace Advanced . Algorithms . DataStructures
@@ -9,18 +10,20 @@ namespace Advanced.Algorithms.DataStructures
9
10
/// <typeparam name="T"></typeparam>
10
11
internal class RangeTreeNode < T > : IComparable where T : IComparable
11
12
{
12
- internal T Data { get ; set ; }
13
+ internal T Value => Values [ 0 ] ;
14
+
15
+ internal List < T > Values { get ; set ; }
13
16
14
17
internal RangeTree < T > tree { get ; set ; }
15
18
16
19
public int CompareTo ( object obj )
17
20
{
18
- return Data . CompareTo ( ( ( RangeTreeNode < T > ) obj ) . Data ) ;
21
+ return Value . CompareTo ( ( ( RangeTreeNode < T > ) obj ) . Value ) ;
19
22
}
20
23
21
24
public RangeTreeNode ( T value )
22
25
{
23
- Data = value ;
26
+ Values = new List < T > ( new T [ ] { value } ) ;
24
27
tree = new RangeTree < T > ( ) ;
25
28
}
26
29
}
@@ -142,10 +145,10 @@ private List<T[]> getInRange(
142
145
{
143
146
var result = new List < T [ ] > ( ) ;
144
147
145
- foreach ( var node in nodes )
148
+ foreach ( var value in nodes . SelectMany ( x => x . Values ) )
146
149
{
147
150
var thisDimResult = new T [ dimensions ] ;
148
- thisDimResult [ dimension ] = node . Data ;
151
+ thisDimResult [ dimension ] = value ;
149
152
result . Add ( thisDimResult ) ;
150
153
}
151
154
@@ -159,10 +162,13 @@ private List<T[]> getInRange(
159
162
{
160
163
var nextDimResult = getInRange ( node . tree , start , end , dimension + 1 ) ;
161
164
162
- foreach ( var nextResult in nextDimResult )
165
+ foreach ( var value in node . Values )
163
166
{
164
- nextResult [ dimension ] = node . Data ;
165
- result . Add ( nextResult ) ;
167
+ foreach ( var nextResult in nextDimResult )
168
+ {
169
+ nextResult [ dimension ] = value ;
170
+ result . Add ( nextResult ) ;
171
+ }
166
172
}
167
173
}
168
174
@@ -215,13 +221,31 @@ public RangeTreeNode<T> Find(T value)
215
221
internal RangeTreeNode < T > Insert ( T value )
216
222
{
217
223
var newNode = new RangeTreeNode < T > ( value ) ;
224
+
225
+ var existing = tree . FindNode ( newNode ) ;
226
+ if ( existing != null )
227
+ {
228
+ existing . Value . Values . Add ( value ) ;
229
+ return existing . Value ;
230
+ }
231
+
218
232
tree . Insert ( newNode ) ;
219
233
return newNode ;
220
234
}
221
235
222
236
internal void Delete ( T value )
223
237
{
224
- tree . Delete ( new RangeTreeNode < T > ( value ) ) ;
238
+ var existing = tree . FindNode ( new RangeTreeNode < T > ( value ) ) ;
239
+
240
+ if ( existing . Value . Values . Count == 1 )
241
+ {
242
+ tree . Delete ( new RangeTreeNode < T > ( value ) ) ;
243
+ return ;
244
+ }
245
+
246
+ //remove last
247
+ existing . Value . Values . RemoveAt ( existing . Value . Values . Count - 1 ) ;
248
+
225
249
}
226
250
227
251
internal List < RangeTreeNode < T > > GetInRange ( T start , T end )
@@ -251,7 +275,7 @@ private List<RangeTreeNode<T>> getInRange(List<RangeTreeNode<T>> result, System.
251
275
//move left
252
276
else
253
277
{
254
- if ( start . CompareTo ( currentNode . Value . Data ) <= 0 )
278
+ if ( start . CompareTo ( currentNode . Value . Value ) <= 0 )
255
279
{
256
280
if ( currentNode . Left != null )
257
281
{
@@ -269,7 +293,7 @@ private List<RangeTreeNode<T>> getInRange(List<RangeTreeNode<T>> result, System.
269
293
//if start is greater than current
270
294
//and end is greater than current
271
295
//move right
272
- if ( end . CompareTo ( currentNode . Value . Data ) < 0 )
296
+ if ( end . CompareTo ( currentNode . Value . Value ) < 0 )
273
297
{
274
298
return result ;
275
299
}
@@ -304,8 +328,8 @@ private List<RangeTreeNode<T>> getInRange(List<RangeTreeNode<T>> result, System.
304
328
private bool inRange ( RedBlackTreeNode < RangeTreeNode < T > > currentNode , T start , T end )
305
329
{
306
330
//start is less than current & end is greater than current
307
- return start . CompareTo ( currentNode . Value . Data ) <= 0
308
- && end . CompareTo ( currentNode . Value . Data ) >= 0 ;
331
+ return start . CompareTo ( currentNode . Value . Value ) <= 0
332
+ && end . CompareTo ( currentNode . Value . Value ) >= 0 ;
309
333
}
310
334
}
311
335
}
0 commit comments