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