diff --git a/README.md b/README.md index c1a3374a..545981ac 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,9 @@ 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) - [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-kth-max/index.js b/src/_DataStructures_/Trees/BinarySearchTree/find-kth-max/index.js new file mode 100644 index 00000000..fb306ca1 --- /dev/null +++ b/src/_DataStructures_/Trees/BinarySearchTree/find-kth-max/index.js @@ -0,0 +1,38 @@ +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..e62468fc --- /dev/null +++ b/src/_DataStructures_/Trees/BinarySearchTree/find-kth-min/index.js @@ -0,0 +1,40 @@ +// 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); + +// // find 3rd max +// console.log(findKthMin(myBST.root, 3)); + +module.exports = findKthMin; 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