mirror of
https://github.com/devenperez/leetcode.git
synced 2026-06-13 03:27:07 +00:00
Time: 117 ms (48.02%), Space: 14.6 MB (88.89%) - LeetHub
This commit is contained in:
+51
@@ -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
|
||||
Reference in New Issue
Block a user