Guest User

Untitled

a guest
Feb 19th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.33 KB | None | 0 0
  1. 'use strict';
  2.  
  3. function BinarySearchTree() {
  4. this.root = null;
  5. }
  6.  
  7. BinarySearchTree.prototype.makeNode = function(value) {
  8. var node = {};
  9. node.value = value;
  10. node.left = null;
  11. node.right = null;
  12. return node;
  13. };
  14.  
  15. BinarySearchTree.prototype.add = function(value) {
  16. var currentNode = this.makeNode(value);
  17. if (!this.root) {
  18. this.root = currentNode;
  19. } else {
  20. this.insert(currentNode);
  21. }
  22. return this;
  23. };
  24.  
  25. BinarySearchTree.prototype.insert = function(currentNode) {
  26. var value = currentNode.value;
  27. var traverse = function(node) {
  28. if (value > node.value) {
  29. if (!node.right) {
  30. node.right = currentNode;
  31. return;
  32. } else traverse(node.right);
  33. } else if (value < node.value) {
  34. if (!node.left) {
  35. node.left = currentNode;
  36. return;
  37. } else traverse(node.left);
  38. }
  39. };
  40. traverse(this.root);
  41. };
  42.  
  43. BinarySearchTree.prototype.remove = function(node) {
  44.  
  45. }
  46.  
  47. BinarySearchTree.prototype.contains = function(value) {
  48. var node = this.root;
  49. var traverse = function(node) {
  50. if (!node) return false;
  51. if (value === node.value) {
  52. return true;
  53. } else if (value > node.value) {
  54. return traverse(node.right);
  55. } else if (value < node.value) {
  56. return traverse(node.left);
  57. }
  58. };
  59. return traverse(node);
  60. };
  61.  
  62. /* BREADTH FIRST TREE TRAVERSAL */
  63.  
  64. /* Breadth First Search finds all the siblings at each level
  65. in order from left to right or from right to left. */
  66.  
  67. BinarySearchTree.prototype.breadthFirstLTR = function() {
  68. var node = this.root;
  69. var queue = [node];
  70. var result = [];
  71. while (node = queue.shift()) {
  72. result.push(node.value);
  73. node.left && queue.push(node.left);
  74. node.right && queue.push(node.right);
  75. }
  76. return result;
  77. };
  78.  
  79.  
  80. BinarySearchTree.prototype.breadthFirstRTL = function() {
  81. var node = this.root;
  82. var queue = [node];
  83. var result = [];
  84. while (node = queue.shift()) {
  85. result.push(node.value);
  86. node.right && queue.push(node.right);
  87. node.left && queue.push(node.left);
  88. }
  89. return result;
  90. };
  91.  
  92. /*DEPTH FIRST TRAVERSALS*/
  93.  
  94. /* preOrder is a type of depth-first traversal that tries
  95. togo deeper in the tree before exploring siblings. It
  96. returns the shallowest descendants first.
  97.  
  98. 1) Display the data part of root element (or current element)
  99. 2) Traverse the left subtree by recursively calling the pre-order function.
  100. 3) Traverse the right subtree by recursively calling the pre-order function. */
  101.  
  102. BinarySearchTree.prototype.preOrder = function() {
  103. var result = [];
  104. var node = this.root;
  105. var traverse = function(node) {
  106. result.push(node.value);
  107. node.left && traverse(node.left);
  108. node.right && traverse(node.right);
  109. };
  110. traverse(node);
  111. return result;
  112. };
  113.  
  114. /* inOrder traversal is a type of depth-first traversal
  115. that also tries to go deeper in the tree before exploring siblings.
  116. however, it returns the deepest descendents first
  117.  
  118. 1) Traverse the left subtree by recursively calling the pre-order function.
  119. 2) Display the data part of root element (or current element)
  120. 3) Traverse the right subtree by recursively calling the pre-order function. */
  121.  
  122. BinarySearchTree.prototype.inOrder = function() {
  123. var result = [];
  124. var node = this.root;
  125. var traverse = function(node) {
  126. node.left && traverse(node.left);
  127. result.push(node.value);
  128. node.right && traverse(node.right);
  129. };
  130. traverse(node);
  131. return result;
  132. };
  133.  
  134. /* postOrder traversal is a type of depth-first traversal
  135. that also tries to go deeper in the tree before exploring siblings.
  136. however, it returns the deepest descendents first
  137.  
  138. 1) Traverse the left subtree by recursively calling the pre-order function.
  139. 2) Display the data part of root element (or current element)
  140. 3) Traverse the right subtree by recursively calling the pre-order function. */
  141.  
  142.  
  143. BinarySearchTree.prototype.postOrder = function() {
  144. var result = [];
  145. var node = this.root;
  146. var traverse = function(node) {
  147. node.left && traverse(node.left);
  148. node.right && traverse(node.right);
  149. result.push(node.value);
  150. };
  151. traverse(node);
  152. return result;
  153. };
  154.  
  155. //find the left most node to find the min value of a binary tree;
  156. BinarySearchTree.prototype.findMin = function() {
  157. var node = this.root;
  158. var traverse = function(node) {
  159. return !node.left ? node.value : traverse(node.left);
  160. };
  161. return traverse(node);
  162. };
  163.  
  164. //find the right most node to find the max value of a binary tree;
  165. BinarySearchTree.prototype.findMax = function() {
  166. var node = this.root;
  167. var traverse = function(node) {
  168. return !node.right ? node.value : traverse(node.right);
  169. };
  170. return traverse(node);
  171. };
  172.  
  173.  
  174. BinarySearchTree.prototype.getDepth = function() {
  175. var node = this.root;
  176. var maxDepth = 0;
  177. var traverse = function(node, depth) {
  178. if (!node) return null;
  179. if (node) {
  180. maxDepth = depth > maxDepth ? depth : maxDepth;
  181. traverse(node.left, depth + 1);
  182. traverse(node.right, depth + 1);
  183. }
  184. };
  185. traverse(node, 0);
  186. return maxDepth;
  187. };
  188.  
  189. BinarySearchTree.prototype.countLeaves = function() {
  190. var count = 0;
  191. var node = this.root;
  192. var traverse = function(node) {
  193. if (!node) return null;
  194. if (!node.left && !node.right) count++;
  195. else traverse(node.left) + traverse(node.right);
  196. };
  197. traverse(node);
  198. return count;
  199. }
  200.  
  201. //Can you write me a function that returns all the averages of the nodes
  202. //at each level (or depth)?? with breadth-first traversal
  203.  
  204. BinarySearchTree.prototype.nodeAverages = function() {
  205. var node = this.root;
  206. var result = {};
  207. var depthAverages = [];
  208.  
  209. var traverse = function(node, depth) {
  210. if (!node) return null;
  211. if (node) {
  212. if (!result[depth])
  213. result[depth] = [node.value];
  214. else
  215. result[depth].push(node.value);
  216. }
  217. //check to see if node is a leaf, depth stays the same if it is
  218. //otherwise increment depth for possible right and left nodes
  219. if (node.right || node.left) {
  220. traverse(node.left, depth + 1);
  221. traverse(node.right, depth + 1);
  222. }
  223. };
  224. traverse(node, 0);
  225.  
  226. //get averages and breadthFirst
  227. for (var key in result) {
  228. var len = result[key].length;
  229. var depthAvg = 0;
  230. for (var i = 0; i < len; i++) {
  231. depthAvg += result[key][i];
  232. }
  233. depthAverages.push(Number((depthAvg / len).toFixed(2)));
  234. }
  235. return depthAverages;
  236. };
  237.  
  238. //Convert a binary search tree to a linked-list in place.
  239. //In-order depth-first traversal.
  240. function LinkedList() {
  241. this.head = null;
  242. }
  243.  
  244. BinarySearchTree.prototype.convertToLinkedList = function() {
  245.  
  246. var result = [];
  247. var node = this.root;
  248. if (!node) return null;
  249.  
  250. var traverse = function(node) {
  251. node.left && traverse(node.left);
  252. result.push(node.value);
  253. node.right && traverse(node.right);
  254. };
  255.  
  256. traverse(node);
  257.  
  258. var makeNode = function(value) {
  259. var node = {};
  260. node.value = value;
  261. node.next = null;
  262. return node;
  263. };
  264.  
  265. var list = new LinkedList();
  266. list.head = makeNode(result[0]);
  267. var current = list.head;
  268.  
  269. for (var i = 1; i < result.length; i++) {
  270. var currentNode = makeNode(result[i]);
  271. current.next = currentNode;
  272. current = current.next;
  273. }
  274. return list;
  275. };
  276.  
  277. //TESTS
  278.  
  279. var bst = new BinarySearchTree();
  280. bst.add(40).add(25).add(78).add(10).add(32);
  281. console.log('BS1', bst);
  282.  
  283. var bst2 = new BinarySearchTree();
  284. bst2.add(10).add(20).add(30).add(5).add(8).add(3).add(9);
  285. console.log('BST2', bst2);
  286. console.log('BREADTHFIRST LTR', bst2.breadthFirstLTR());
  287. console.log('BREADTHFIRST RTL', bst2.breadthFirstRTL());
  288. console.log('PREORDER', bst2.preOrder());
  289. console.log('INORDER', bst2.inOrder());
  290. console.log('POSTORDER', bst2.postOrder());
  291.  
  292. /*
  293. BREADTHFIRST LTR [ 10, 5, 20, 3, 8, 30, 9 ]
  294. BREADTHFIRST RTL [ 10, 20, 5, 30, 8, 3, 9 ]
  295. PREORDER [ 10, 5, 3, 8, 9, 20, 30 ]
  296. INORDER [ 3, 5, 8, 9, 10, 20, 30 ]
  297. POSTORDER [ 3, 9, 8, 5, 30, 20, 10 ]
  298. */
  299.  
  300. var bst3 = new BinarySearchTree();
  301. bst3.add('j').add('f').add('k').add('z').add('a').add('h').add('d');
  302. console.log(bst3);
  303. console.log('BREADTHFIRST LTR', bst3.breadthFirstLTR());
  304. console.log('BREADTHFIRST RTL', bst3.breadthFirstRTL());
  305. console.log('PREORDER', bst3.preOrder());
  306. console.log('INORDER', bst3.inOrder());
  307. console.log('POSTORDER', bst3.postOrder());
  308.  
  309. /*
  310. BREADTHFIRST LTR [ 'j', 'f', 'k', 'a', 'h', 'z', 'd' ]
  311. BREADTHFIRST RTL [ 'j', 'k', 'f', 'z', 'h', 'a', 'd' ]
  312. PREORDER [ 'j', 'f', 'a', 'd', 'h', 'k', 'z' ]
  313. INORDER [ 'a', 'd', 'f', 'h', 'j', 'k', 'z' ]
  314. POSTORDER [ 'd', 'a', 'h', 'f', 'z', 'k', 'j' ]
  315. */
  316.  
  317.  
  318. console.log(bst2.findMin()); // 3
  319. console.log(bst2.findMax()); // 30
  320. console.log(bst2.contains(15));
  321. //bst2.add(55);
  322. //bst2.add(65);
  323. //bst3.add(75);
  324. console.log(bst2);
  325. console.log(bst2.getDepth()); // 3
  326. console.log(bst2.add(7).add(50).add(80).add(98));
  327. console.log(bst2.getDepth()); // 5
  328. console.log(bst2.nodeAverages()); //[ 10, 12.5, 13.67, 22, 80, 98 ]
  329.  
  330. console.log(bst2.convertToLinkedList());
  331. //[ 3, 5, 7, 8, 9, 10, 20, 30, 50, 80, 98 ]
  332. //{ head: { value: 3, next: { value: 5, next: [Object] } } }
Add Comment
Please, Sign In to add comment