diff --git a/README.md b/README.md index c1a3374a..37708c9e 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,12 @@ Collection of interview questions with Unit Tests. Problems includes Data Struct - [Doubly Linked List](src/_DataStructures_/DoublyLinkedList) - [Trees](src/_DataStructures_/Trees) - - [Binary Search Tree](src/_DataStructures_/Trees/BST) + - [Binary Search Tree](src/_DataStructures_/Trees/BinarySearchTree) + - [Find kth maximum in a BinarySearchTree](src/_DataStructures_/Trees/BinarySearchTree/find-kth-max) + - [Find kth minimum in a BinarySearchTree](src/_DataStructures_/Trees/BinarySearchTree/find-kth-min) + - [Find Ancestors of a Node](src/_DataStructures_/Trees/BinarySearchTree/find-ancestors) + - [Find Height of BST](src/_DataStructures_/Trees/BinarySearchTree/height-of-bst) + - [Find k Nodes from Root of BST](src/_DataStructures_/Trees/BinarySearchTree/find-k-nodes-from-root) - [Suffix Tree](src/_DataStructures_/SuffixTree) ### Logical Problems diff --git a/src/_DataStructures_/Trees/BST/Node.js b/src/_DataStructures_/Trees/BinarySearchTree/Node.js similarity index 100% rename from src/_DataStructures_/Trees/BST/Node.js rename to src/_DataStructures_/Trees/BinarySearchTree/Node.js diff --git a/src/_DataStructures_/Trees/BinarySearchTree/find-ancestors/index.js b/src/_DataStructures_/Trees/BinarySearchTree/find-ancestors/index.js new file mode 100644 index 00000000..4ccea5f9 --- /dev/null +++ b/src/_DataStructures_/Trees/BinarySearchTree/find-ancestors/index.js @@ -0,0 +1,49 @@ +// eslint-disable-next-line no-unused-vars +const BST = require('../index'); + +/** You should go through this conversation here: + * https://github.com/knaxus/problem-solving-javascript/pull/63 + */ + +function findAncestors(root, value) { + /** + * search the given node and meanwhile + * keep pushing the visited nodes + */ + if (root === null) return false; + + if (value < root.value) { + const left = findAncestors(root.leftChild, value); + if (left) { + return [...left, root.value]; + } + return false; + } + + if (value > root.value) { + const right = findAncestors(root.rightChild, value); + if (right) { + return [...right, root.value]; + } + return false; + } + + if (value === root.value) return []; + return false; +} + +// create a BST +// const myBST = new BST(6); +// myBST.add(4); +// myBST.add(9); +// myBST.add(2); +// myBST.add(5); +// myBST.add(14); +// myBST.add(8); +// myBST.add(12); +// myBST.add(10); + +// console.log(findAncestors(myBST.root, 10)); +// console.log(findAncestors(myBST.root, 101)); + +module.exports = findAncestors; diff --git a/src/_DataStructures_/Trees/BinarySearchTree/find-k-nodes-from-root/index.js b/src/_DataStructures_/Trees/BinarySearchTree/find-k-nodes-from-root/index.js new file mode 100644 index 00000000..25aa70d1 --- /dev/null +++ b/src/_DataStructures_/Trees/BinarySearchTree/find-k-nodes-from-root/index.js @@ -0,0 +1,33 @@ +// eslint-disable-next-line no-unused-vars +const BST = require('../index'); + +function findKNodes(root, k) { + let arr = []; + + if (root === null) return []; + if (k === 0) return [...arr, root.value]; + + const left = findKNodes(root.leftChild, k - 1); + arr = [...arr, ...left]; + + const right = findKNodes(root.rightChild, k - 1); + arr = [...arr, ...right]; + return arr; +} + +// create a BST +// const myBST = new BST(6); + +// myBST.add(2); +// myBST.add(19); +// myBST.add(14); +// myBST.add(8); +// myBST.add(5); +// myBST.add(12); +// myBST.add(33); +// myBST.add(52); +// myBST.add(1); + +// console.log(findKNodes(myBST.root, 2)); + +module.exports = findKNodes; diff --git a/src/_DataStructures_/Trees/BinarySearchTree/find-kth-max/index.js b/src/_DataStructures_/Trees/BinarySearchTree/find-kth-max/index.js new file mode 100644 index 00000000..21ba18f7 --- /dev/null +++ b/src/_DataStructures_/Trees/BinarySearchTree/find-kth-max/index.js @@ -0,0 +1,39 @@ +// eslint-disable-next-line no-unused-vars +const BST = require('../index'); + +// Inorder traversal returns a sorted array +function inOrderTraversal(root) { + if (root === null) return []; + let arr = []; + // traverse left + const left = inOrderTraversal(root.leftChild); + arr = [...left, root.value]; + const right = inOrderTraversal(root.rightChild); + return [...arr, ...right]; +} + +function findKthMax(rootNode, k) { + const arr = inOrderTraversal(rootNode); + if (k <= 0 || k > arr.lenth) { + throw new Error('Invalid value for K'); + } + return arr[arr.length - k]; +} + +// // create a BST +// const myBST = new BST(6); + +// myBST.add(2); +// myBST.add(19); +// myBST.add(14); +// myBST.add(8); +// myBST.add(5); +// myBST.add(12); +// myBST.add(33); +// myBST.add(52); +// myBST.add(1); + +// // find 3rd max +// console.log(findKthMax(myBST.root, 3)); + +module.exports = findKthMax; diff --git a/src/_DataStructures_/Trees/BinarySearchTree/find-kth-min/index.js b/src/_DataStructures_/Trees/BinarySearchTree/find-kth-min/index.js new file mode 100644 index 00000000..ad18cdea --- /dev/null +++ b/src/_DataStructures_/Trees/BinarySearchTree/find-kth-min/index.js @@ -0,0 +1,39 @@ +// eslint-disable-next-line no-unused-vars +const BST = require('../index'); + +// Inorder traversal returns a sorted array +function inOrderTraversal(root) { + if (root === null) return []; + let arr = []; + // traverse left + const left = inOrderTraversal(root.leftChild); + arr = [...left, root.value]; + const right = inOrderTraversal(root.rightChild); + return [...arr, ...right]; +} + +function findKthMin(rootNode, k) { + const arr = inOrderTraversal(rootNode); + if (k <= 0 || k > arr.lenth) { + throw new Error('Invalid value for K'); + } + return arr[k - 1]; +} + +// // create a BST +// const myBST = new BST(6); + +// myBST.add(2); +// myBST.add(19); +// myBST.add(14); +// myBST.add(8); +// myBST.add(5); +// myBST.add(12); +// myBST.add(33); +// myBST.add(52); +// myBST.add(1); +// myBST.add(0); + +// console.log(findKthMin(myBST.root, 3)); + +module.exports = findKthMin; diff --git a/src/_DataStructures_/Trees/BinarySearchTree/height-of-bst/index.js b/src/_DataStructures_/Trees/BinarySearchTree/height-of-bst/index.js new file mode 100644 index 00000000..ad4f1ee7 --- /dev/null +++ b/src/_DataStructures_/Trees/BinarySearchTree/height-of-bst/index.js @@ -0,0 +1,33 @@ +// eslint-disable-next-line no-unused-vars +const BST = require('../index'); + +function findHeightOfBST(root) { + let leftHeight = 0; + let rightHeight = 0; + + if (root === null) return 0; + leftHeight = findHeightOfBST(root.leftChild); + rightHeight = findHeightOfBST(root.rightChild); + + if (leftHeight > rightHeight) { + return leftHeight + 1; + } + return rightHeight + 1; +} + +// create a BST +// const myBST = new BST(6); +// myBST.add(4); +// myBST.add(9); +// myBST.add(2); +// myBST.add(5); +// myBST.add(14); +// myBST.add(8); +// myBST.add(12); +// myBST.add(10); + +// // console.log(myBST.root); +// console.log(myBST.traversePreorder()); +// console.log(findHeightOfBST(myBST.root)); + +module.exports = findHeightOfBST; diff --git a/src/_DataStructures_/Trees/BST/index.js b/src/_DataStructures_/Trees/BinarySearchTree/index.js similarity index 100% rename from src/_DataStructures_/Trees/BST/index.js rename to src/_DataStructures_/Trees/BinarySearchTree/index.js