Design Add and Search Words Data Structure

class TreeNode:
    
    def __init__(self, val):
        self.val = val
        self.children = {}
        self.end = False
    
    def add_child(self, c):
        self.children[c] = TreeNode(c)

class WordDictionary:

    def __init__(self):
        self.root = TreeNode('')
        
    def addWord(self, word):
        temp = self.root
        for cx, c in enumerate(word):
            node = temp.children.get(c)
            if not node:
                temp.add_child(c)
            temp = temp.children[c]
        temp.end = True

    def search(self, word, start=None):
        temp = start if start else self.root
        for cx, c in enumerate(word):
            if c == '.':
                flag = False
                for cc in temp.children:
                    flag = flag or self.search(word[1 + cx::], temp.children[cc])
                return flag
            if c not in temp.children:
                return False
            temp = temp.children[c]
        return temp.end