|
|
|
@ -319,3 +319,34 @@ def binary_tree_from_list(inlist: list[int | None]) -> stdlib.BinaryTreeNode | N
|
|
|
|
|
node.right = nodes_copy.pop()
|
|
|
|
|
|
|
|
|
|
return root
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def binary_tree_from_preorder_inorder(
|
|
|
|
|
preorder: list[int], inorder: list[int]
|
|
|
|
|
) -> stdlib.BinaryTreeNode | None:
|
|
|
|
|
preorder_reversed = preorder[::-1]
|
|
|
|
|
|
|
|
|
|
def subtree(left: list[int], right: list[int]) -> stdlib.BinaryTreeNode:
|
|
|
|
|
root: stdlib.BinaryTreeNode = typing.cast(
|
|
|
|
|
stdlib.BinaryTreeNode, stdlib.TreeNode(preorder_reversed.pop())
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
if len(left) > 1:
|
|
|
|
|
split_pos = left.index(preorder_reversed[-1])
|
|
|
|
|
root.left = subtree(left[:split_pos], left[split_pos + 1 :])
|
|
|
|
|
elif len(left) == 1:
|
|
|
|
|
preorder_reversed.remove(left[0])
|
|
|
|
|
root.left = typing.cast(stdlib.BinaryTreeNode, stdlib.TreeNode(left[0]))
|
|
|
|
|
|
|
|
|
|
if len(right) > 1:
|
|
|
|
|
split_pos = right.index(preorder_reversed[-1])
|
|
|
|
|
root.right = subtree(right[:split_pos], right[split_pos + 1 :])
|
|
|
|
|
elif len(right) == 1:
|
|
|
|
|
preorder_reversed.remove(right[0])
|
|
|
|
|
root.right = typing.cast(stdlib.BinaryTreeNode, stdlib.TreeNode(right[0]))
|
|
|
|
|
|
|
|
|
|
return root
|
|
|
|
|
|
|
|
|
|
split_pos = inorder.index(preorder[0])
|
|
|
|
|
|
|
|
|
|
return subtree(inorder[:split_pos], inorder[split_pos + 1 :])
|
|
|
|
|