11using System ;
2+ using System . Linq ;
23using System . Collections . Generic ;
34
45namespace Advanced . Algorithms . DataStructures
@@ -9,18 +10,20 @@ namespace Advanced.Algorithms.DataStructures
910 /// <typeparam name="T"></typeparam>
1011 internal class RangeTreeNode < T > : IComparable where T : IComparable
1112 {
12- internal T Data { get ; set ; }
13+ internal T Value => Values [ 0 ] ;
14+
15+ internal List < T > Values { get ; set ; }
1316
1417 internal RangeTree < T > tree { get ; set ; }
1518
1619 public int CompareTo ( object obj )
1720 {
18- return Data . CompareTo ( ( ( RangeTreeNode < T > ) obj ) . Data ) ;
21+ return Value . CompareTo ( ( ( RangeTreeNode < T > ) obj ) . Value ) ;
1922 }
2023
2124 public RangeTreeNode ( T value )
2225 {
23- Data = value ;
26+ Values = new List < T > ( new T [ ] { value } ) ;
2427 tree = new RangeTree < T > ( ) ;
2528 }
2629 }
@@ -142,10 +145,10 @@ private List<T[]> getInRange(
142145 {
143146 var result = new List < T [ ] > ( ) ;
144147
145- foreach ( var node in nodes )
148+ foreach ( var value in nodes . SelectMany ( x => x . Values ) )
146149 {
147150 var thisDimResult = new T [ dimensions ] ;
148- thisDimResult [ dimension ] = node . Data ;
151+ thisDimResult [ dimension ] = value ;
149152 result . Add ( thisDimResult ) ;
150153 }
151154
@@ -159,10 +162,13 @@ private List<T[]> getInRange(
159162 {
160163 var nextDimResult = getInRange ( node . tree , start , end , dimension + 1 ) ;
161164
162- foreach ( var nextResult in nextDimResult )
165+ foreach ( var value in node . Values )
163166 {
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+ }
166172 }
167173 }
168174
@@ -215,13 +221,31 @@ public RangeTreeNode<T> Find(T value)
215221 internal RangeTreeNode < T > Insert ( T value )
216222 {
217223 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+
218232 tree . Insert ( newNode ) ;
219233 return newNode ;
220234 }
221235
222236 internal void Delete ( T value )
223237 {
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+
225249 }
226250
227251 internal List < RangeTreeNode < T > > GetInRange ( T start , T end )
@@ -251,7 +275,7 @@ private List<RangeTreeNode<T>> getInRange(List<RangeTreeNode<T>> result, System.
251275 //move left
252276 else
253277 {
254- if ( start . CompareTo ( currentNode . Value . Data ) <= 0 )
278+ if ( start . CompareTo ( currentNode . Value . Value ) <= 0 )
255279 {
256280 if ( currentNode . Left != null )
257281 {
@@ -269,7 +293,7 @@ private List<RangeTreeNode<T>> getInRange(List<RangeTreeNode<T>> result, System.
269293 //if start is greater than current
270294 //and end is greater than current
271295 //move right
272- if ( end . CompareTo ( currentNode . Value . Data ) < 0 )
296+ if ( end . CompareTo ( currentNode . Value . Value ) < 0 )
273297 {
274298 return result ;
275299 }
@@ -304,8 +328,8 @@ private List<RangeTreeNode<T>> getInRange(List<RangeTreeNode<T>> result, System.
304328 private bool inRange ( RedBlackTreeNode < RangeTreeNode < T > > currentNode , T start , T end )
305329 {
306330 //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 ;
309333 }
310334 }
311335}
0 commit comments