1
+ function AVLTree ( ) {
2
+
3
+ var Node = function ( key ) {
4
+ this . key = key ;
5
+ this . left = null ;
6
+ this . right = null ;
7
+ } ;
8
+
9
+ var root = null ;
10
+
11
+ this . getRoot = function ( ) {
12
+ return root ;
13
+ } ;
14
+
15
+ var heightNode = function ( node ) {
16
+ if ( node === null ) {
17
+ return - 1 ;
18
+ } else {
19
+ return Math . max ( heightNode ( node . left ) , heightNode ( node . right ) ) + 1 ;
20
+ }
21
+ } ;
22
+
23
+ var rotationLL = function ( node ) {
24
+ var tmp = node . left ;
25
+ node . left = tmp . right ;
26
+ tmp . right = node ;
27
+
28
+ return tmp ;
29
+ } ;
30
+
31
+ var rotationRR = function ( node ) {
32
+ var tmp = node . right ;
33
+ node . right = tmp . left ;
34
+ tmp . left = node ;
35
+
36
+ return tmp ;
37
+ } ;
38
+
39
+ var rotationLR = function ( node ) {
40
+ node . left = rotationRR ( node . left ) ;
41
+ return rotationLL ( node ) ;
42
+ } ;
43
+
44
+ var rotationRL = function ( node ) {
45
+ node . right = rotationLL ( node . right ) ;
46
+ return rotationRR ( node ) ;
47
+ } ;
48
+
49
+ var insertNode = function ( node , element ) {
50
+
51
+ if ( node === null ) {
52
+ node = new Node ( element ) ;
53
+
54
+ } else if ( element < node . key ) {
55
+
56
+ node . left = insertNode ( node . left , element ) ;
57
+
58
+ if ( node . left !== null ) {
59
+
60
+ if ( ( heightNode ( node . left ) - heightNode ( node . right ) ) > 1 ) {
61
+ if ( element < node . left . key ) {
62
+ node = rotationLL ( node ) ;
63
+ } else {
64
+ node = rotationLR ( node ) ;
65
+ }
66
+ }
67
+ }
68
+ } else if ( element > node . key ) {
69
+
70
+ node . right = insertNode ( node . right , element ) ;
71
+
72
+ if ( node . right !== null ) {
73
+
74
+ if ( ( heightNode ( node . right ) - heightNode ( node . left ) ) > 1 ) {
75
+
76
+ if ( element > node . right . key ) {
77
+ node = rotationRR ( node ) ;
78
+ } else {
79
+ node = rotationRL ( node ) ;
80
+ }
81
+ }
82
+ }
83
+ }
84
+
85
+ return node ;
86
+ } ;
87
+
88
+ this . insert = function ( element ) {
89
+ root = insertNode ( root , element ) ;
90
+ } ;
91
+
92
+ var parentNode ;
93
+ var nodeToBeDeleted ;
94
+
95
+ var removeNode = function ( node , element ) {
96
+ if ( node === null ) {
97
+ return null ;
98
+ }
99
+ parentNode = node ;
100
+
101
+ if ( element < node . key ) {
102
+ node . left = removeNode ( node . left , element ) ;
103
+ } else {
104
+ nodeToBeDeleted = node ;
105
+ node . right = removeNode ( node . right , element ) ;
106
+ }
107
+
108
+ if ( node === parentNode ) { //remove node
109
+ if ( nodeToBeDeleted !== null && element === nodeToBeDeleted . key ) {
110
+ if ( nodeToBeDeleted === parentNode ) {
111
+ node = node . left ;
112
+ } else {
113
+ var tmp = nodeToBeDeleted . key ;
114
+ nodeToBeDeleted . key = parentNode . key ;
115
+ parentNode . key = tmp ;
116
+ node = node . right ;
117
+ }
118
+ }
119
+ } else { //do balancing
120
+
121
+ if ( node . left === undefined ) node . left = null ;
122
+ if ( node . right === undefined ) node . right = null ;
123
+
124
+ if ( ( heightNode ( node . left ) - heightNode ( node . right ) ) === 2 ) {
125
+ if ( element < node . left . key ) {
126
+ node = rotationLR ( node ) ;
127
+ } else {
128
+ node = rotationLL ( node ) ;
129
+ }
130
+ }
131
+
132
+ if ( ( heightNode ( node . right ) - heightNode ( node . left ) ) === 2 ) {
133
+ if ( element > node . right . key ) {
134
+ node = rotationRL ( node ) ;
135
+ } else {
136
+ node = rotationRR ( node ) ;
137
+ }
138
+ }
139
+ }
140
+
141
+ return node ;
142
+ } ;
143
+
144
+ this . remove = function ( element ) {
145
+ parentNode = null ;
146
+ nodeToBeDeleted = null ;
147
+ root = removeNode ( root , element ) ;
148
+ } ;
149
+ }
0 commit comments