Skip to content

Commit d0f7bbf

Browse files
committed
added chapter 08
1 parent aea3084 commit d0f7bbf

7 files changed

+255
-0
lines changed

chapter08.zip

2.54 KB
Binary file not shown.

chapter08/01-BinarySearchTree.js

+181
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
function BinarySearchTree() {
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.insert = function(key){
12+
13+
var newNode = new Node(key);
14+
15+
//special case - first element
16+
if (root === null){
17+
root = newNode;
18+
} else {
19+
insertNode(root,newNode);
20+
}
21+
};
22+
23+
var insertNode = function(node, newNode){
24+
if (newNode.key < node.key){
25+
if (node.left === null){
26+
node.left = newNode;
27+
} else {
28+
insertNode(node.left, newNode);
29+
}
30+
} else {
31+
if (node.right === null){
32+
node.right = newNode;
33+
} else {
34+
insertNode(node.right, newNode);
35+
}
36+
}
37+
};
38+
39+
this.getRoot = function(){
40+
return root;
41+
};
42+
43+
this.search = function(key){
44+
45+
return searchNode(root, key);
46+
};
47+
48+
var searchNode = function(node, key){
49+
50+
if (node === null){
51+
return false;
52+
}
53+
54+
if (key < node.key){
55+
return searchNode(node.left, key);
56+
57+
} else if (key > node.key){
58+
return searchNode(node.right, key);
59+
60+
} else { //element is equal to node.item
61+
return true;
62+
}
63+
};
64+
65+
this.inOrderTraverse = function(callback){
66+
inOrderTraverseNode(root, callback);
67+
};
68+
69+
var inOrderTraverseNode = function (node, callback) {
70+
if (node !== null) {
71+
inOrderTraverseNode(node.left, callback);
72+
callback(node.key);
73+
inOrderTraverseNode(node.right, callback);
74+
}
75+
};
76+
77+
this.preOrderTraverse = function(callback){
78+
preOrderTraverseNode(root, callback);
79+
};
80+
81+
var preOrderTraverseNode = function (node, callback) {
82+
if (node !== null) {
83+
callback(node.key);
84+
preOrderTraverseNode(node.left, callback);
85+
preOrderTraverseNode(node.right, callback);
86+
}
87+
};
88+
89+
this.postOrderTraverse = function(callback){
90+
postOrderTraverseNode(root, callback);
91+
};
92+
93+
var postOrderTraverseNode = function (node, callback) {
94+
if (node !== null) {
95+
postOrderTraverseNode(node.left, callback);
96+
postOrderTraverseNode(node.right, callback);
97+
callback(node.key);
98+
}
99+
};
100+
101+
this.min = function() {
102+
return minNode(root);
103+
};
104+
105+
var minNode = function (node) {
106+
while (node && node.left !== null) {
107+
node = node.left;
108+
}
109+
110+
return node.key;
111+
};
112+
113+
this.max = function() {
114+
return maxNode(root);
115+
};
116+
117+
var maxNode = function (node) {
118+
while (node && node.right !== null) {
119+
node = node.right;
120+
}
121+
122+
return node.key;
123+
};
124+
125+
this.remove = function(element){
126+
root = removeNode(root, element);
127+
};
128+
129+
var findMinNode = function(node){
130+
while (node && node.left !== null) {
131+
node = node.left;
132+
}
133+
134+
return node;
135+
};
136+
137+
var removeNode = function(node, element){
138+
139+
if (node === null){
140+
return null;
141+
}
142+
143+
if (element < node.key){
144+
node.left = removeNode(node.left, element);
145+
return node;
146+
147+
} else if (element > node.key){
148+
node.right = removeNode(node.right, element);
149+
return node;
150+
151+
} else { //element is equal to node.item
152+
153+
//handle 3 special conditions
154+
//1 - a leaf node
155+
//2 - a node with only 1 child
156+
//3 - a node with 2 children
157+
158+
//case 1
159+
if (node.left === null && node.right === null){
160+
node = null;
161+
return node;
162+
}
163+
164+
//case 2
165+
if (node.left === null){
166+
node = node.right;
167+
return node;
168+
169+
} else if (node.right === null){
170+
node = node.left;
171+
return node;
172+
}
173+
174+
//case 3
175+
var aux = findMinNode(node.right);
176+
node.key = aux.key;
177+
node.right = removeNode(node.right, aux.key);
178+
return node;
179+
}
180+
};
181+
}
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
<title></title>
6+
</head>
7+
<body>
8+
<script type="text/javascript" src="01-BinarySearchTree.js"></script>
9+
<script type="text/javascript" src="02-UsingBinarySearchTree.js"></script>
10+
</body>
11+
</html>

chapter08/02-UsingBinarySearchTree.js

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
var tree = new BinarySearchTree();
2+
3+
tree.insert(11);
4+
tree.insert(7);
5+
tree.insert(15);
6+
tree.insert(5);
7+
tree.insert(3);
8+
tree.insert(9);
9+
tree.insert(8);
10+
tree.insert(10);
11+
tree.insert(13);
12+
tree.insert(12);
13+
tree.insert(14);
14+
tree.insert(20);
15+
tree.insert(18);
16+
tree.insert(25);
17+
tree.insert(6);
18+
19+
console.log('********* in-order transverse ***********');
20+
function printNode(value){
21+
console.log(value);
22+
}
23+
tree.inOrderTraverse(printNode);
24+
25+
console.log('********* pre-order transverse ***********');
26+
tree.preOrderTraverse(printNode);
27+
28+
console.log('********* post-order transverse ***********');
29+
tree.postOrderTraverse(printNode);
30+
31+
32+
console.log('********* max and min ***********');
33+
console.log(tree.max());
34+
console.log(tree.min());
35+
console.log(tree.search(1) ? 'Key 1 found.' : 'Key 1 not found.');
36+
console.log(tree.search(8) ? 'Key 8 found.' : 'Key 8 not found.');
37+
38+
39+
console.log('********* remove 6 ***********');
40+
tree.remove(6);
41+
tree.inOrderTraverse(printNode);
42+
43+
console.log('********* remove 5 ***********');
44+
tree.remove(5);
45+
tree.inOrderTraverse(printNode);
46+
47+
console.log('********* remove 15 ***********');
48+
tree.remove(15);
49+
tree.inOrderTraverse(printNode);
50+
51+
console.log('********* raw data structure ***********');
52+
console.log(tree.getRoot());

chapter08/03-AVLTree.js

Whitespace-only changes.

chapter08/04-UsingAVLTree.html

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
<title></title>
6+
</head>
7+
<body>
8+
<script type="text/javascript" src="03-AVLTree.js"></script>
9+
<script type="text/javascript" src="04-UsingAVLTree.js"></script>
10+
</body>
11+
</html>

chapter08/04-UsingAVLTree.js

Whitespace-only changes.

0 commit comments

Comments
 (0)