题目
我们从二叉树的根节点 root 开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。
示例 1:
输入:"1-2--3--4-5--6--7"
输出:[1,2,5,3,4,6,7]
示例 2:
输入:"1-2--3---4-5--6---7"
输出:[1,2,5,3,null,6,null,4,null,7]
示例 3:
输入:"1-401--349---90--88"
输出:[1,401,null,349,88,90]
提示:
原始树中的节点数介于 1 和 1000 之间。
每个节点的值介于 1 和 10 ^ 9 之间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
- 首先将构建树和输出遍历分开。从示例可以看出,最后输出的遍历是BFS,用队列很好做。主要是从DFS的输出str中重构树,这基本上就是参考将str切分好,然后用DFS重新跑一遍就行了。采用递归实现。
代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def getLRTree(self, slist):
leftn = None
rightn = None
if len(slist) == 2:
leftn = TreeNode(slist[1])
return leftn, rightn
elif len(slist) == 0:
return leftn, rightn
level_s = slist[0]
second_s = 0
str1=''
str2=''
#print(slist)
for i in range(1, len(slist)):
if slist[i] == level_s:
second_s = i
break
if second_s != 0:
str1 = slist[2:second_s]
str2 = slist[second_s + 2 :]
rightn = TreeNode(slist[second_s+1])
rightn_l, rightn_r = self.getLRTree(str2)
rightn.left = rightn_l
rightn.right = rightn_r
else:
str1 = slist[2:]
leftn = TreeNode(slist[1])
leftn_l, leftn_r = self.getLRTree(str1)
leftn.left = leftn_l
leftn.right = leftn_r
return leftn, rightn
def recoverFromPreorder(self, S: str) -> TreeNode:
split_list = []
tmp_str = ''
store = False
for i in range(len(S)):
tmp_str += S[i]
if i == len(S) - 1:
split_list.append(tmp_str)
break
if (S[i] != '-' and S[i+1] == '-') or (S[i] == '-' and S[i+1] != '-'):
split_list.append(tmp_str)
tmp_str = ''
root = TreeNode(split_list[0])
leftn, rightn = self.getLRTree(split_list[1:])
root.left = leftn
root.right = rightn
# print out
result_queue = [root]
result_list = []
while len(result_queue) > 0:
tmp_n = result_queue.pop(0)
if not tmp_n:
result_list.append('null')
continue
result_list.append(tmp_n.val)
result_queue.append(tmp_n.left)
result_queue.append(tmp_n.right)
return root