題目描述
思路
- 雖說標籤是
hard
類型的,但是題目不難 - 具體思路如下:
- 節點樹爲
1~1000
,可以判定首節點一定存在 - 首先提取出
root
節點,和深度一起拼成tuple
,放到一個棧中 (數組也行) - 然後遍歷剩餘節點,統計其深度 和 數值 (深度用
-
表示) - 然後 遍歷到的剩餘節點的深度 和 棧中最後一個節點的深度 只有 大於、等於 和 小於
3
種情況。 - 如果是大於,只可能深度比前者大
1
- 如果是小於,那可能小任意值,這裏用循環
pop
出棧中深度不等的node
- 代碼如下:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def recoverFromPreorder(self, S: str) -> TreeNode:
import collections
queue = collections.deque()
index = 0
while index < len(S) and S[index] != '-':
index += 1
Head = TreeNode(int(S[:index]))
queue.append((Head, 0)) # node, node's deepth
num, cnt, key = 0, 0, True # 節點值, 節點值前的橫線數
for i in range(index, len(S)):
if S[i] == '-':
cnt += 1
else:
num = num*10 + int(S[i])
if i+1 == len(S) or (i+1 < len(S) and S[i+1] == '-'):
node = TreeNode(num)
while cnt < queue[-1][1]: # 深度小於上一個節點的深度
queue.pop()
if cnt == queue[-1][1] + 1: # 比上個節點深1層
if not queue[-1][0].left: # left 爲空
queue[-1][0].left = node
else:
queue[-1][0].right = node
elif cnt == queue[-1][1]: # 和上一個節點深度相同
queue.pop()
queue[-1][0].right = node
queue.append((node, cnt))
num, cnt = 0, 0
return Head