这题这么理解,节点的数量不大于 50000, 按照最差情况下,这个tree是BST来做高度计算,当高度为16时,我们有2**16(= 65536 > 50000)个节点, 所以从root向下走,最多走15步到达最远的子节点,所以我们用全局常量self.step = 15来确定我们树的高度。同时我们计算2**step的距离下,各个节点的2**step距离的父节点,并存入self.parentlist中,则我们得到parentlist中的每个元素为一个字典,字典的index代表如果求某个节点的2**index距离的父节点,可以到第index个字典中寻找。接下来,在getKth函数中,当k> 2**steps距离时,我们跳到第steps个dict中,寻找目标节点的当前距离(2**steps)的父节点,并更新节点为这个父节点,并减少距离。而如果K不大于等于2**steps,则steps-1.
class TreeAncestor:
def __init__(self, n: int, parent: List[int]):
self.steps = 15
steps = self.steps
parent_2to_step = dict(enumerate(parent))
parentlist = [parent_2to_step]
for step in range(steps):
parent_2to_step_plus_one = {}
for i in parent_2to_step:
if parent_2to_step[i] in parent_2to_step:
parent_2to_step_plus_one[i]=parent_2to_step[parent_2to_step[i]]
parentlist.append(parent_2to_step_plus_one)
parent_2to_step = parent_2to_step_plus_one
self.parentlist = parentlist
def getKthAncestor(self, node: int, k: int) -> int:
steps = self.steps
parentlist = self.parentlist
while k > 0 and node != -1:
if k >= 1<<steps:
node = parentlist[steps].get(node, -1)
k -= 1 << steps
else:
steps -= 1
return node