2
2
3
3
if ( typeof module !== 'undefined' ) module . exports = bbtree ;
4
4
5
- function Node ( key , left , right , level ) {
5
+ function Node ( key , level , left , right ) {
6
6
this . key = key ;
7
+ this . level = level ;
7
8
this . left = left ;
8
9
this . right = right ;
9
- this . level = level ;
10
10
}
11
11
12
- var bottom = new Node ( null , null , null , 0 ) ;
12
+ var bottom = new Node ( null , 0 ) ;
13
13
bottom . left = bottom ;
14
14
bottom . right = bottom ;
15
15
16
+ function newNode ( key ) {
17
+ return new Node ( key , 1 , bottom , bottom ) ;
18
+ }
19
+
16
20
function bbtree ( compareFn ) {
17
21
// jshint validthis: true
18
22
if ( ! ( this instanceof bbtree ) ) return new bbtree ( compareFn ) ;
19
23
20
24
this . _compare = compareFn || defaultCompare ;
25
+ this . _path = [ ] ;
21
26
}
22
27
23
28
bbtree . prototype = {
@@ -32,48 +37,48 @@ bbtree.prototype = {
32
37
insert : function ( key ) {
33
38
34
39
var compare = this . _compare ,
35
- newNode = new Node ( key , bottom , bottom , 1 ) ;
40
+ node = this . root ,
41
+ path = this . _path ;
36
42
37
- if ( ! this . root ) {
38
- this . root = newNode ;
43
+ if ( ! node ) {
44
+ this . root = newNode ( key ) ;
39
45
return this ;
40
46
}
41
47
42
- var node = this . root ,
43
- path = [ ] ;
48
+ var k = 0 ;
44
49
45
50
while ( true ) {
46
51
var c = compare ( key , node . key ) ;
47
52
if ( ! c ) return this ;
48
53
49
- path . push ( node ) ;
54
+ path [ k ] = node ;
55
+ k ++ ;
50
56
51
57
if ( c < 0 ) {
52
- if ( node . left === bottom ) { node . left = newNode ; break ; }
58
+ if ( node . left === bottom ) { node . left = newNode ( key ) ; break ; }
53
59
node = node . left ;
54
60
55
61
} else {
56
- if ( node . right === bottom ) { node . right = newNode ; break ; }
62
+ if ( node . right === bottom ) { node . right = newNode ( key ) ; break ; }
57
63
node = node . right ;
58
64
}
59
65
}
60
66
61
- this . _rebalance ( path ) ;
67
+ this . _rebalance ( path , k ) ;
62
68
63
69
return this ;
64
70
} ,
65
71
66
- _rebalance : function ( path ) {
72
+ _rebalance : function ( path , k ) {
67
73
68
- var rotated , node , parent , updated ;
74
+ var rotated , node , parent , updated , m = 0 ;
69
75
70
- for ( var i = path . length - 1 ; i >= 0 ; i -- ) {
76
+ for ( var i = k - 1 ; i >= 0 ; i -- ) {
71
77
rotated = node = path [ i ] ;
72
- updated = false ;
73
78
74
79
if ( node . level === node . left . level && node . level === node . right . level ) {
75
- node . level ++ ;
76
80
updated = true ;
81
+ node . level ++ ;
77
82
78
83
} else {
79
84
rotated = skew ( node ) ;
@@ -89,8 +94,8 @@ bbtree.prototype = {
89
94
90
95
} else this . root = rotated ;
91
96
}
92
-
93
- if ( ! updated ) break ;
97
+ if ( ! updated ) m ++ ;
98
+ if ( m === 2 ) break ;
94
99
}
95
100
}
96
101
} ;
0 commit comments