class Node
{
constructor(newData)
{
this
.data = newData;
this
.end = 0;
this
.left =
null
;
this
.eq =
null
;
this
.right =
null
;
}
}
function
createNode(newData) {
const newNode =
new
Node(newData);
newNode.end = 0;
newNode.left =
null
;
newNode.eq =
null
;
newNode.right =
null
;
return
newNode;
}
function
insert(root, word, pos = 0)
{
if
(!root) {
root = createNode(word[pos]);
}
if
(root.data > word[pos]) {
root.left = insert(root.left, word, pos);
}
else
if
(root.data < word[pos]) {
root.right = insert(root.right, word, pos);
}
else
{
if
(pos + 1 === word.length)
{
root.end = 1;
}
else
{
root.eq = insert(root.eq, word, pos + 1);
}
}
return
root;
}
function
traverse(root, ret, buff, depth = 0) {
if
(!root) {
return
;
}
traverse(root.left, ret, buff, depth);
buff[depth] = root.data;
if
(root.end) {
buff[depth + 1] = '\0
';
ret.push(buff.slice(0, depth + 1).join(""));
}
// Traverse the equal subtree
traverse(root.eq, ret, buff, depth + 1);
// Traverse the right subtree
traverse(root.right, ret, buff, depth);
}
// Utility function to find all the words
function util(root, pattern)
{
// Stores the words to suggest
const buffer = Array.from({ length: 1001 }, () => null);
const ret = [];
traverse(root, ret, buffer);
if (root.end === 1) {
ret.push(pattern);
}
return ret;
}
// Function to autocomplete
// based on the given prefix
// and return the suggestions
function autocomplete(root, pattern) {
let words = [];
let pos = 0;
// If pattern is empty
// return an empty list
if (!pattern) {
return words;
}
// Iterating over the characters
// of the pattern and find it'
s
while
(root && pos < pattern.length)
{
if
(root.data > pattern[pos])
{
root = root.left;
}
else
if
(root.data < pattern[pos])
{
root = root.right;
}
else
if
(root.data === pattern[pos])
{
root = root.eq;
pos += 1;
}
else
{
return
words;
}
}
words = util(root, pattern);
return
words;
}
function
printSuggestions(sugg, pat) {
for
(let sug of sugg) {
console.log(pat + sug);
}
}
let S = [
'wallstreet'
,
'geeksforgeeks'
,
'wallmart'
,
'walmart'
,
'waldormort'
,
'word'
];
let tree =
null
;
for
(let str of S) {
tree = insert(tree, str);
}
let pat =
'wall'
;
let sugg = autocomplete(tree, pat);
if
(!sugg) {
console.log(
'None'
);
}
else
{
printSuggestions(sugg, pat);
}