Clean and simple Python Solution - Standard Trie + DFS
Trie + DFS\n\n\nclass TrieNode:\n    def __init__(self):\n        self.children = {}\n        self.isword =False\n        \n    @staticmethod\n    def construct
Trie + DFS\n\n```\nclass TrieNode:\n    def __init__(self):\n        self.children = {}\n        self.isword =False\n        \n    @staticmethod\n    def construct_trie(words):\n        root = TrieNode()\n        for w in words :\n            node = root\n            for c in w:\n                node.children.setdefault(c,TrieNode())\n                node = node.children[c]\n            node.isword=True\n        return root\n\nclass Solution:\n    def longestWord(self, words: List[str]) -> str:\n\t\t# Loading list in Trie structure\n        trie = TrieNode.construct_trie(words)\n\n        self.longest=""\n        \n        def record_max(root,S):\n            if root.isword:\n                # if we are in a valid tree\n\t\t\t\t# check if we found a new long string\n                if len(S) > len(self.longest):\n                    self.longest = S\n\t\t\t\t# sorting because we need smallest lexical word\n                for c in sorted(root.children):\n\t\t\t\t\t# recursion \n                    record_max(root.children[c],S+c)\n       \n\t   # setting root.isword as True for cleaner code and getting kick start with root\n\t   trie.isword= True\n       \n\t   record_max(trie,"")\n       return self.longest\n\n```
['Depth-First Search']