From c84d092488a87a25a891a49c6b4f3c8175f12a18 Mon Sep 17 00:00:00 2001 From: bumpsoo Date: Sat, 22 Feb 2025 23:36:40 +0900 Subject: [PATCH] https://leetcode.com/problems/recover-a-tree-from-preorder-traversal --- .../recover_a_tree_from_preorder_traversal.py | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 hard/recover_a_tree_from_preorder_traversal.py diff --git a/hard/recover_a_tree_from_preorder_traversal.py b/hard/recover_a_tree_from_preorder_traversal.py new file mode 100644 index 0000000..cf53a12 --- /dev/null +++ b/hard/recover_a_tree_from_preorder_traversal.py @@ -0,0 +1,42 @@ +# 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 +