难度:中等

思路:
class LockingTree:
def __init__(self, parent: List[int]):
self.parent = parent
self.child = defaultdict(list)
for c, p in enumerate(self.parent):
self.child[p].append(c)
self.locked = [-1] * len(parent)
def lock(self, num: int, user: int) -> bool:
if self.locked[num] == -1:
self.locked[num] = user
return True
return False
def unlock(self, num: int, user: int) -> bool:
if self.locked[num] == user:
self.locked[num] = -1
return True
return False
def upgrade(self, num: int, user: int) -> bool:
n = num
while n != -1:
if self.locked[n] != -1:
return False
n = self.parent[n]
def find(root):
t = False
for i in self.child[root]:
if self.locked[i] != -1:
self.locked[i] = -1
t = True
if find(i):
t = True
return t
if find(num):
self.locked[num] = user
return True
return False