[Leetcode解題] 1028. Recover a Tree From Preorder Traversal
22 February 2025
hard
array
題目
1028. Recover a Tree From Preorder Traversal
這題給定一個preorder DFS的樹,以字串表達,並且以dash('-')
表達深度,求我們還原成用資料結構表示的樹
解題思路
這題的重點是,我們要如何紀錄下當時正確的parent
舉例來說,給定一個字串"1-2--3--4-5--6--7"
,我可以知道,2因為深度增加,所以會是上一個點的子節點,但關鍵是我們要如何取得正確的父節點。
我們可以透過一個stack,並且維持這個stack的長度不大於當前點的深度,這樣可以確保stack.top()
就是該點的父節點。
通常需要這種取得特殊位置值的情況,可以考慮stack
或者monotonic stack
來想
class Solution:
def recoverFromPreorder(self, traversal: str) -> Optional[TreeNode]:
stack = []
i = 0
while i < len(traversal):
depth = 0
while i < len(traversal) and traversal[i] == '-':
depth += 1
i += 1
num = 0
while i < len(traversal) and traversal[i].isdigit():
num = num * 10 + int(traversal[i])
i += 1
node = TreeNode(num)
while len(stack) > depth:
stack.pop()
if stack:
if stack[-1].left is None:
stack[-1].left = node
else:
stack[-1].right = node
stack.append(node)
return stack[0]
時間複雜度
要跑過一輪traversal字串,複雜度為$O(n)$, $n$為traversal字串的長度