1+ function Node ( start , end , left , right ) {
2+ this . interval = [ start , end ] ;
3+ this . maxRight = - Infinity ;
4+ this . parentNode = null ;
5+ this . left = left ;
6+ this . right = right ;
7+ }
8+
9+ function IntervalTree ( ) {
10+ this . root = null ;
11+ }
12+
13+ function addNode ( node , side , interval ) {
14+ var child = new Node ( interval [ 0 ] , interval [ 1 ] ) ;
15+ child . parentNode = node ;
16+ node [ side ] = child ;
17+ if ( side === 'right' && node . maxRight < interval [ 1 ] ) {
18+ while ( child ) {
19+ child . maxRight = interval [ 1 ] ;
20+ child = child . parentNode ;
21+ }
22+ }
23+ }
24+
25+ function addHelper ( node , interval ) {
26+ if ( node . interval [ 0 ] > interval [ 0 ] ) {
27+ if ( node . left ) {
28+ addHelper ( node . left , interval ) ;
29+ } else {
30+ addNode ( node , 'left' , interval ) ;
31+ }
32+ } else {
33+ if ( node . right ) {
34+ addHelper ( node . right , interval ) ;
35+ } else {
36+ addNode ( node , 'right' , interval ) ;
37+ }
38+ }
39+ }
40+
41+ IntervalTree . prototype . add = function ( interval ) {
42+ if ( ! this . root ) {
43+ this . root = new Node ( interval [ 0 ] , interval [ 1 ] ) ;
44+ return ;
45+ }
46+ addHelper ( this . root , interval ) ;
47+ } ;
0 commit comments