- 从先序遍历还原二叉树
https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal/
想法挺简单的,先把S处理成pre,和flag两个数组,pre是先序遍历,flag是pre里每个节点的深度。
然后就是一个dfs,将pre和flag两个数组传进去,
类似于中序后续确定一棵树的算法,从右找到第一level+1的下标记为j,然后从1到j就是左子树,(如果i,j不相等),如果相等就是全部都是左子树,然后就分成了左右两个子树,继续递归,如果i==j,那么就是只有左子树,如果数组成都等于1就返回这个节点。
class Solution:
def recoverFromPreorder(self, S: str) -> TreeNode:
flag,pre = [],[]
c = 0
s = ''
flagx = True
for d in S:
if d != '-':
s += d
if flagx or c!=0:
flag.append(c)
flagx = False
c = 0
else:
if s!='':
pre.append(s)
s = ''
c += 1
pre.append(s)
def dfs(pre,flag):
if len(pre)==1:
return TreeNode(pre[0])
root = TreeNode(pre[0])
level = flag[0]
for j in range(len(pre)-1,-1,-1):
if flag[j] == level+1:
break
i = 1
if i==j:
root.left = dfs(pre[1:],flag[1:])
return root
else:
lpre ,rpre = pre[1:j],pre[j:]
lflag,rflag = flag[1:j],flag[j:]
root.left = dfs(lpre,lflag)
root.right = dfs(rpre,rflag)
return root
return dfs(pre,flag)