Leetcode 1600. Throne Inheritance [Python]

系统设计题目,下面的版本卡在第48个TC,TLE了。思考了一下,每次查找需要操作的node时,都可以优化,而不用从头BFS,所以可以看第二个版本,使用全局的字典,key-value直接对应到每个node的name和这个node本身。

class TreeNode:
    def __init__(self, name):
        self.name = name
        self.children = []
        self.liveordeath = True
        
class ThroneInheritance:
    def __init__(self, kingName: str):
        self.root = TreeNode(kingName)

    def birth(self, parentName: str, childName: str) -> None:
        root = self.root  
        
        def bfs(node, parentName):
            que = collections.deque()
            que.append(node)
            while que:
                size = len(que)
                for _ in range(size):
                    curnode = que.popleft()
                    if curnode.name != parentName:
                        for curnode_child in curnode.children:
                            que.append(curnode_child)
                    else:
                        return curnode
                    
        node = bfs(root, parentName)
        child_node = TreeNode(childName)
        node.children.append(child_node)

    def death(self, name: str) -> None:
        root = self.root
        
        def bfs(node):
            que = collections.deque()
            que.append(node)
            while que:
                size = len(que)
                for _ in range(size):
                    curnode = que.popleft()
                    if curnode.name != name:
                        for curnode_child in curnode.children:
                            que.append(curnode_child)
                    else:
                        return curnode
                    
        node = bfs(root)
        node.liveordeath = False

    def getInheritanceOrder(self) -> List[str]:
        root = self.root
        res = []
        
        def dfs(node):
            if node.liveordeath:
                res.append(node.name)
            if not len(node.children):
                return
            else:
                for child in node.children:
                    dfs(child)
                    
        dfs(root)
        return res 


# Your ThroneInheritance object will be instantiated and called as such:
# obj = ThroneInheritance(kingName)
# obj.birth(parentName,childName)
# obj.death(name)
# param_3 = obj.getInheritanceOrder()

第二个版本如下:

class TreeNode:
    def __init__(self, name):
        self.name = name
        self.children = []
        self.liveordie = True

class ThroneInheritance:

    def __init__(self, kingName: str):
        self.root = TreeNode(kingName)
        self.dic = dict()
        self.dic[kingName] = self.root

    def birth(self, parentName: str, childName: str) -> None:
        curnode = self.dic[parentName]
        newnode = TreeNode(childName)
        self.dic[childName] = newnode
        curnode.children.append(newnode)
        
    def death(self, name: str) -> None:
        curnode = self.dic[name]
        curnode.liveordie = False
        

    def getInheritanceOrder(self) -> List[str]:
        root = self.root
        res = []
        def dfs(node):
            if node.liveordie:
                res.append(node.name)
            if not len(node.children):
                return
            else:
                for child in node.children:
                    dfs(child)
        dfs(root)
        return res 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值