Time: 117 ms (48.02%), Space: 14.6 MB (88.89%) - LeetHub

This commit is contained in:
Deven
2023-01-18 22:30:31 -05:00
parent cc463a3ea8
commit 870ed27f67
@@ -0,0 +1,51 @@
# Definition for a binary tree node.
# 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]:
# Gets next node in traversal (and removes it from the string)
# Returns (value, depth)
def getNextNode() -> tuple[int, int]:
nonlocal traversal
# Find depth
depth = 0
while traversal[0] == "-":
depth += 1
traversal = traversal[1:]
# Find value
value = 0
while len(traversal) > 0 and traversal[0] != "-":
value = (value * 10) + int(traversal[0])
traversal = traversal[1:]
return (value, depth)
# Base Case: empty tree
if len(traversal) == 0:
return None
root = TreeNode(getNextNode()[0])
currentRoute = [root]
while len(traversal) > 0:
nodePair = getNextNode()
# Go deeper
if nodePair[1] == len(currentRoute):
currentRoute[-1].left = TreeNode(nodePair[0])
currentRoute.append(currentRoute[-1].left)
continue
# Go back up the tree
while nodePair[1] < len(currentRoute):
currentRoute.pop()
currentRoute[-1].right = TreeNode(nodePair[0])
currentRoute.append(currentRoute[-1].right)
return root