题目描述
思路
- 虽说标签是
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