Medium

Throne InheritancePython

Full explanation · Time ctor: O(1) birth: O(1) death: O(1) inherit: O(n) · Space O(n)

# Time:  ctor:    O(1)
#        birth:   O(1)
#        death:   O(1)
#        inherit: O(n)
# Space: O(n)

import collections


class ThroneInheritance(object):

    def __init__(self, kingName):
        """
        :type kingName: str
        """
        self.__king = kingName
        self.__family_tree = collections.defaultdict(list)
        self.__dead = set()
        

    def birth(self, parentName, childName):
        """
        :type parentName: str
        :type childName: str
        :rtype: None
        """
        self.__family_tree[parentName].append(childName)


    def death(self, name):
        """
        :type name: str
        :rtype: None
        """
        self.__dead.add(name)
        
    
    def getInheritanceOrder(self):
        """
        :rtype: List[str]
        """
        result = []
        stk = [self.__king]
        while stk:  # preorder traversal
            node = stk.pop()
            if node not in self.__dead:
                result.append(node)
            if node not in self.__family_tree:
                continue
            for child in reversed(self.__family_tree[node]):
                stk.append(child)
        return result