Skip to content

Commit 124f668

Browse files
committed
AVL tree code
1 parent fedf84e commit 124f668

File tree

4 files changed

+218
-3
lines changed

4 files changed

+218
-3
lines changed

chapter08/02-UsingBinarySearchTree.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,8 @@ tree.remove(15);
4949
tree.inOrderTraverse(printNode);
5050

5151
console.log('********* raw data structure ***********');
52-
console.log(tree.getRoot());
52+
console.log(tree.getRoot());
53+
54+
console.log('********* printing HTML tree ***********');
55+
var parent = document.getElementsByTagName('body')[0];
56+
printHTMLTree(tree.getRoot(), parent, 255);

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+
}

chapter08/04-UsingAVLTree.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<title></title>
66
</head>
77
<body>
8-
<script type="text/javascript" src="03-AVLTree.js"></script>
9-
<script type="text/javascript" src="04-UsingAVLTree.js"></script>
8+
<script src="03-AVLTree.js"></script>
9+
<script src="04-UsingAVLTree.js"></script>
1010
</body>
1111
</html>

chapter08/04-UsingAVLTree.js

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
var avlTree = new AVLTree();
2+
3+
avlTree.insert(1);
4+
avlTree.insert(2);
5+
avlTree.insert(3);
6+
avlTree.insert(4);
7+
avlTree.insert(5);
8+
avlTree.insert(6);
9+
avlTree.insert(7);
10+
avlTree.insert(14);
11+
avlTree.insert(15);
12+
avlTree.insert(13);
13+
avlTree.insert(12);
14+
avlTree.insert(11);
15+
16+
//RR rotation
17+
/*avlTree.insert(50);
18+
avlTree.insert(30);
19+
avlTree.insert(70);
20+
avlTree.insert(60);
21+
avlTree.insert(80);
22+
avlTree.insert(90);*/
23+
24+
//LL rotation
25+
/*avlTree.insert(50);
26+
avlTree.insert(30);
27+
avlTree.insert(70);
28+
avlTree.insert(10);
29+
avlTree.insert(40);
30+
avlTree.insert(5);*/
31+
32+
//LR rotation
33+
/*avlTree.insert(50);
34+
avlTree.insert(30);
35+
avlTree.insert(70);
36+
avlTree.insert(40);
37+
avlTree.insert(10);
38+
avlTree.insert(35);*/
39+
40+
//RL rotation
41+
/*avlTree.insert(70);
42+
avlTree.insert(50);
43+
avlTree.insert(80);
44+
avlTree.insert(72);
45+
avlTree.insert(90);
46+
avlTree.insert(75);*/
47+
48+
console.log('********* raw data structure ***********');
49+
console.log(avlTree.getRoot());
50+
51+
/*avlTree.remove(12);
52+
avlTree.remove(15);
53+
avlTree.remove(11);
54+
avlTree.remove(14);
55+
avlTree.remove(13);
56+
avlTree.remove(7);
57+
avlTree.remove(6);
58+
avlTree.remove(2);
59+
avlTree.remove(4);
60+
61+
console.log(avlTree.getRoot());*/
62+

0 commit comments

Comments
 (0)