42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
# https://leetcode.com/problems/recover-a-tree-from-preorder-traversal
|
|
|
|
from typing import Optional
|
|
|
|
class TreeNode:
|
|
def __init__(self, val=0, left=None, right=None):
|
|
self.val = val
|
|
self.left = left
|
|
self.right = right
|
|
|
|
class Solution:
|
|
def recoverFromPreorder(self, traversal: str) -> Optional[TreeNode]:
|
|
i = 0
|
|
def recurse(level, curr: TreeNode):
|
|
nonlocal i
|
|
val = []
|
|
while i < len(traversal) and traversal[i] != '-':
|
|
val.append(traversal[i])
|
|
i += 1
|
|
if len(val) > 0:
|
|
curr.val = int(''.join(val))
|
|
|
|
next_level = 0
|
|
while i + next_level < len(traversal) and traversal[i + next_level] == '-':
|
|
next_level += 1
|
|
if next_level == level + 1:
|
|
i += next_level
|
|
curr.left = TreeNode()
|
|
recurse(next_level, curr.left)
|
|
|
|
next_level = 0
|
|
while i + next_level < len(traversal) and traversal[i + next_level] == '-':
|
|
next_level += 1
|
|
if next_level == level + 1:
|
|
i += next_level
|
|
curr.right = TreeNode()
|
|
recurse(next_level, curr.right)
|
|
|
|
result = TreeNode()
|
|
recurse(0, result)
|
|
return result
|
|
|