题解的核心思路是从给定的节点 label 开始向上回溯至根节点。在每个节点上进行操作时,需要考虑其所在行的顺序。偶数行节点的排列是从右到左的,而奇数行是从左到右。为了找到父节点,首先通过整除2得到父节点的标号。接着,为了得到正确的父节点标号,需要计算其在之字形排列中的实际位置。这通过计算当前行的范围,然后使用之字形转换公式(当前标号转换为正常二叉树中的对应位置)实现。该过程一直持续到到达根节点。最后,反转结果列表以得到从根节点到 label 的路径。
时间复杂度: O(log(label))
空间复杂度: O(log(label))
class Solution:
def pathInZigZagTree(self, label: int) -> List[int]:
def get_range(depth):
# 计算给定深度的最小和最大节点标号
return 2 ** depth, 2 ** (depth + 1) - 1
res = []
while label > 1:
# 将当前节点加入路径列表
res.append(label)
# 计算父节点的标号
label = label // 2
# 计算当前深度
depth = int(log(label, 2))
# 获取父节点层的范围
abo_min, abo_max = get_range(depth)
# 计算在之字形排列中的实际父节点标号
label = abo_max - (label - abo_min)
# 加入根节点
if label == 1:
res.append(label)
# 反转列表以得到从根节点到 label 的路径
return res[::-1]