Related Articles
Print Strings In Reverse Dictionary Order Using Trie
• Last Updated : 09 Dec, 2020

Trie is an efficient information retrieval data structure. Using Trie, search complexities can be brought to an optimal limit.
Given an array of strings. The task is to print all strings in reverse dictionary order using Trie. If there are duplicates in the input array, we need to print them only once.
Examples:

```Input: str = {"cat", "there", "caller", "their", "calling"}
Output: there
their
cat
calling
caller

root
/     \
c       t
|       |
a       h
| \     |
l  t    e
|       |  \
l       i   r
| \     |   |
e  i    r   e
|  |
r  n
|
g

Input: str = {"Candy", "cat", "Caller", "calling"}
Output: cat
candy
calling
caller
root
|
c
|
a
/   | \
l    n  t
|    |
l    d
| \  |
e  i y
|  |
r  n
|
g```

Approach:

To solve the problem mentioned above, first, construct a Trie using all strings then print a string of rightmost subtree from top to bottom then print a string of second right subtree from top to bottom then print for third right subtree and so on. It is similar to preorder traversal of a tree from right to left.

Below is the implementation of the above approach:

## CPP

 `// C++ programm to print array of string``// in reverse dictionary order using trie` `#include ``using` `namespace` `std;` `#define CHILDREN 26``#define MAX 100` `// Trie node``struct` `trie {``    ``trie* child[CHILDREN];` `    ``// endOfWord is true``    ``// if the node represents``    ``// end of a word``    ``bool` `endOfWord;``};` `// Function will return``// the new node initialized NULL``trie* createNode()``{``    ``trie* temp = ``new` `trie();` `    ``temp->endOfWord = ``false``;` `    ``for` `(``int` `i = 0; i < CHILDREN; i++) {` `        ``// Initialize null to the all child``        ``temp->child[i] = NULL;``    ``}``    ``return` `temp;``}` `// Function will insert the``// string in a trie recursively``void` `insertRecursively(trie* itr,``                       ``string str, ``int` `i)``{` `    ``if` `(i < str.length()) {``        ``int` `index = str[i] - ``'a'``;` `        ``if` `(itr->child[index] == NULL) {` `            ``// Create a new node``            ``itr->child[index] = createNode();``        ``}` `        ``// Recursive call for insertion of string``        ``insertRecursively(itr->child[index], str, i + 1);``    ``}``    ``else` `{` `        ``// Make the endOfWord``        ``// true which represents``        ``// the end of string``        ``itr->endOfWord = ``true``;``    ``}``}` `// Function call to insert a string``void` `insert(trie* itr, string str)``{``    ``// Function call with necessary arguments``    ``insertRecursively(itr, str, 0);``}` `// Function to check whether the node is leaf or not``bool` `isLeafNode(trie* root)``{``    ``return` `root->endOfWord != ``false``;``}` `// Function to display the content of trie``void` `displayContent(trie* root, ``char` `str[], ``int` `level)``{` `    ``// If node is leaf node, it indicates end``    ``// of string, so a null character is added``    ``// and string is displayed``    ``if` `(isLeafNode(root)) {``        ``// Assign a null character in temporary string``        ``str[level] = ``'\0'``;``        ``cout << str << endl;``    ``}` `    ``for` `(``int` `i = CHILDREN - 1; i >= 0; i--) {` `        ``// check if NON NULL child is found``        ``// add parent key to str and``        ``// call the display function recursively``        ``// for child node``        ``if` `(root->child[i]) {``            ``str[level] = i + ``'a'``;``            ``displayContent(root->child[i], str, level + 1);``        ``}``    ``}``}` `// Function call for displaying content``void` `display(trie* itr)``{``    ``int` `level = 0;` `    ``char` `str[MAX];` `    ``displayContent(itr, str, level);``}` `// Driver code``int` `main()``{``    ``trie* root = createNode();``    ``insert(root, ``"their"``);``    ``insert(root, ``"there"``);``    ``insert(root, ``"answer"``);``    ``insert(root, ``"any"``);` `    ``/* After inserting strings, trie will look like``                                        ``root``                                        ``/ \``                                        ``a     t    ``                                        ``|     |    ``                                        ``n     h    ``                                        ``| \ |``                                        ``s y e    ``                                        ``|     | \``                                        ``w     i r``                                        ``|     | |``                                        ``e     r e``                                        ``|    ``                                        ``r``    ``*/` `    ``display(root);` `    ``return` `0;``}`

## Python3

 `# Python3 programm to print array of string``# in reverse dictionary order using trie`` ` `CHILDREN ``=` `26``MAX` `=` `100`` ` `# Trie node``class` `trie:``    ` `    ``def` `__init__(``self``):      ``        ``self``.child ``=` `[``0` `for` `i ``in` `range``(CHILDREN)]``    ` `        ``# endOfWord is true``        ``# if the node represents``        ``# end of a word``        ``self``.endOfWord ``=` `False``;` `# Function will return``# the new node initialized NONE``def` `createNode():` `    ``temp ``=` `trie();`` ` `    ``temp.endOfWord ``=` `False``;``    ` `    ``for` `i ``in` `range``(CHILDREN):`` ` `        ``# Initialize null to the all child``        ``temp.child[i] ``=` `None``;``    ` `    ``return` `temp;` `# Function will insert the``# string in a trie recursively``def` `insertRecursively(itr, ``str``, i):`` ` `    ``if` `(i < ``len``(``str``)):``        ` `        ``index ``=` `ord``(``str``[i]) ``-` `ord``(``'a'``);`` ` `        ``if` `(itr.child[index] ``=``=` `None``):`` ` `            ``# Create a new node``            ``itr.child[index] ``=` `createNode();`` ` `        ``# Recursive call for insertion of string``        ``insertRecursively(itr.child[index], ``str``, i ``+` `1``);``    ` `    ``else``:`` ` `        ``# Make the endOfWord``        ``# true which represents``        ``# the end of string``        ``itr.endOfWord ``=` `True``;``    ` `# Function call to insert a string``def` `insert(itr, ``str``):` `    ``# Function call with necessary arguments``    ``insertRecursively(itr, ``str``, ``0``);`` ` `# Function to check whether the node is leaf or not``def` `isLeafNode(root):` `    ``return` `root.endOfWord !``=` `False``;`` ` `# Function to display the content of trie``def` `displayContent(root, ``str``, level):`` ` `    ``# If node is leaf node, it indicates end``    ``# of string, so a null character is added``    ``# and string is displayed``    ``if` `(isLeafNode(root)):``      ` `        ``# Assign a null character in temporary string``        ``print``("".join(``str``[:level]))``    ` `    ``for` `i ``in` `range``(CHILDREN``-``1``, ``-``1``, ``-``1``):`` ` `        ``# check if NON NONE child is found``        ``# add parent key to str and``        ``# call the display function recursively``        ``# for child node``        ``if` `(root.child[i]):``            ``str``[level] ``=` `chr``(i ``+` `ord``(``'a'``));``            ``displayContent(root.child[i], ``str``, level ``+` `1``);`` ` `# Function call for displaying content``def` `display(itr):` `    ``level ``=` `0``;`` ` `    ``str` `=` `['' ``for` `i ``in` `range``(``MAX``)];`` ` `    ``displayContent(itr, ``str``, level);` `# Driver code``if` `__name__``=``=``'__main__'``:``    ` `    ``root ``=` `createNode();``    ` `    ``insert(root, ``"their"``);``    ``insert(root, ``"there"``);``    ``insert(root, ``"answer"``);``    ``insert(root, ``"any"``);`` ` `    ``''' After inserting strings, trie will look like``                                        ``root``                                        ``/ \``                                        ``a     t    ``                                        ``|     |    ``                                        ``n     h    ``                                        ``| \ |``                                        ``s y e    ``                                        ``|     | \``                                        ``w     i r``                                        ``|     | |``                                        ``e     r e``                                        ``|    ``                                        ``r``    ``'''`` ` `    ``display(root);`` ` `# This code is contributed by rutvik_56`
Output:
```there
their
any