【LeetCode每日一题】2020.6.18 1028. 从先序遍历还原二叉树
1028. 从先序遍历还原二叉树
我们从二叉树的根节点 root 开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。
示例:
输入:"1-2--3--4-5--6--7"
输出:[1,2,5,3,4,6,7]
分析:
感觉自己讲得不好,贴出官方题解。我觉得关键在于理解递归栈的大小和结点深度的关系。
代码(Python):
class Solution:
def recoverFromPreorder(self, S: str) -> TreeNode:
path = [] # 存储结点
pos = 0 # 存储遍历位置
while pos < len(S):
level = 0 # 存储结点深度
while S[pos] == '-':
# 增加结点深度
level += 1
pos += 1
value = 0 # 存储结点值
while pos < len(S) and S[pos].isdigit():
value = value * 10 + (ord(S[pos]) - ord('0'))
pos += 1
node = TreeNode(value)
# 如果当前结点深度正好等于目前存储得结点个数,说明该节点就是根结点的左子结点
if level == len(path):
if path:
path[-1].left = node
# 说明该节点位于根结点左侧,且是左侧的最后一个结点,即左侧某个结点的右结点
else:
path = path[:level]
path[-1].right = node
path.append(node)
return path[0]