Skip to content

Commit d12ebc2

Browse files
committedFeb 27, 2016
Update 03-AVLTree.js
1 parent a7285d9 commit d12ebc2

File tree

1 file changed

+149
-0
lines changed

1 file changed

+149
-0
lines changed
 

‎chapter08/03-AVLTree.js

+149
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
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

Comments
 (0)