diff --git a/README.md b/README.md index ae8cbe0f..6d258a35 100644 --- a/README.md +++ b/README.md @@ -31,17 +31,16 @@ Collection of interview questions with Unit Tests. Problems includes Data Struct - [Implement 2 Stacks using Single Array](src/_DataStructures_/Stack/2-stacks-using1-array) - [Sort a Stack](src/_DataStructures_/Stack/sort-a-stack) - -- [Queue](src/_DataStructures_/Queue) +* [Queue](src/_DataStructures_/Queue) - [Weave](src/_DataStructures_/Queue/weave) - [Reverse First K Elements of a Queue](src/_DataStructures_/Queue/reverse-first-k) - [Generate all Binary Numbers from 1 to N](src/_DataStructures_/Queue/generate-binary-number) - [Queue using Stack](src/_DataStructures_/Queue/queue-using-stack) -- [Doubly Linked List](src/_DataStructures_/DoublyLinkedList) +* [Doubly Linked List](src/_DataStructures_/DoublyLinkedList) -- [Trees](src/_DataStructures_/Trees) +* [Trees](src/_DataStructures_/Trees) - [Binary Tree (creation using level order)](src/_DataStructures_/Trees/BinaryTree) - [Binary Search Tree](src/_DataStructures_/Trees/BinarySearchTree) - [Find kth maximum in a BinarySearchTree](src/_DataStructures_/Trees/BinarySearchTree/find-kth-max) @@ -50,6 +49,7 @@ Collection of interview questions with Unit Tests. Problems includes Data Struct - [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) + - [Trie](src/_DataStructures_/Trees/Trie) ### Logical Problems diff --git a/src/_DataStructures_/Trees/Trie/Node.js b/src/_DataStructures_/Trees/Trie/Node.js new file mode 100644 index 00000000..05f6e673 --- /dev/null +++ b/src/_DataStructures_/Trees/Trie/Node.js @@ -0,0 +1,20 @@ +class TrieNode { + constructor(char) { + this.char = char; + this.children = []; + this.isEndOfWord = false; + + // mark all the alphabets as null + for (let i = 0; i < 26; i += 1) this.children[i] = null; + } + + markAsLeaf() { + this.isEndOfWord = true; + } + + unmarkAsLeaf() { + this.isEndOfWord = false; + } +} + +module.exports = TrieNode; diff --git a/src/_DataStructures_/Trees/Trie/index.js b/src/_DataStructures_/Trees/Trie/index.js new file mode 100644 index 00000000..58222c96 --- /dev/null +++ b/src/_DataStructures_/Trees/Trie/index.js @@ -0,0 +1,73 @@ +const Node = require('./Node'); + +class Trie { + constructor() { + this.root = new Node(''); + } + + // helper to get the index of a character + // eslint-disable-next-line class-methods-use-this + getIndexOfChar(char) { + return char.charCodeAt(0) - 'a'.charCodeAt(0); + } + + insert(key) { + if (!key) { + return false; + } + + // convert to lower case + // keys are basically words + const word = key.toLowerCase(); + let currentNode = this.root; + + for (let level = 0; level < word.length; level += 1) { + const index = this.getIndexOfChar(word[level]); + if (!currentNode.children[index]) { + currentNode.children[index] = new Node(word[level]); + } + currentNode = currentNode.children[index]; + } + + // when we are done with inserting all the character of the word, + // mark the node as end leaf + currentNode.markAsLeaf(); + return true; + } + + search(key) { + if (!key) { + return false; + } + + // convert word to lower case + const word = key.toLowerCase(); + let currentNode = this.root; + + for (let level = 0; level < word.length; level += 1) { + const index = this.getIndexOfChar(word[level]); + if (!currentNode.children[index]) { + return false; + } + currentNode = currentNode.children[index]; + } + if (currentNode !== null && currentNode.isEndOfWord) { + return true; + } + return false; + } +} + +// const words = ['bed', 'ball', 'apple', 'java', 'javascript']; +// const trie = new Trie(); + +// words.forEach(word => trie.insert(word)); + +// console.log(trie.root); + +// console.log(trie.search(words[3])); +// console.log(trie.search('word')); +// console.log(trie.search(words[4])); +// console.log(trie.search('random')); + +module.exports = Trie;