系统设计题目,下面的版本卡在第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