#include <iostream>
using namespace std;

struct TrieNode {
    TrieNode *children[26]{};
    bool isWord;
    TrieNode(): isWord(false) {}  /* to be deleted */
    void display(string s) { 
    	cout <<"<"<<s<<"> " << (isWord ?"is":"isn't")<<" a word:"; 
    	for (int i=0; i<26; i++) 
    	    if (children[i]) 
    	        cout << static_cast<char>('a'+i); 
    	cout<<endl; 
    	for (int i=0; i<26; i++) 
    	    if (children[i]) 
    	        children[i]->display (s+static_cast<char>('a'+i)); 
    }
};

void buildTree(TrieNode *root, string word) {
    TrieNode *cur = root;
    for (char c : word) {
        if (!cur->children[c-'a'])
            cur->children[c-'a'] = new TrieNode();
        cur = cur->children[c-'a'];
    }
    cur->isWord = true;
}
int main() {
	TrieNode t; 
	
	buildTree(&t, "test");
	buildTree(&t, "tesla");
	buildTree(&t, "tesa");
	
	t.display(""); 
	return 0;
}