Cheating with binary tree goop
This commit is contained in:
parent
10ec594031
commit
ffb16efcdc
@ -46,8 +46,8 @@ class TreeNode:
|
|||||||
|
|
||||||
for key, value in [
|
for key, value in [
|
||||||
("val", self.val),
|
("val", self.val),
|
||||||
("right", self.right),
|
|
||||||
("left", self.left),
|
("left", self.left),
|
||||||
|
("right", self.right),
|
||||||
]:
|
]:
|
||||||
if value is not None:
|
if value is not None:
|
||||||
filtered_parts.append((key, value))
|
filtered_parts.append((key, value))
|
||||||
|
@ -319,3 +319,34 @@ def binary_tree_from_list(inlist: list[int | None]) -> stdlib.BinaryTreeNode | N
|
|||||||
node.right = nodes_copy.pop()
|
node.right = nodes_copy.pop()
|
||||||
|
|
||||||
return root
|
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 :])
|
||||||
|
@ -229,3 +229,35 @@ def test_binary_tree_from_list(
|
|||||||
inlist: list[int | None], expected: stdlib.BinaryTreeNode | None
|
inlist: list[int | None], expected: stdlib.BinaryTreeNode | None
|
||||||
):
|
):
|
||||||
assert stuff.binary_tree_from_list(inlist) == expected
|
assert stuff.binary_tree_from_list(inlist) == expected
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("preorder", "inorder", "expected"),
|
||||||
|
[
|
||||||
|
(
|
||||||
|
[3, 9, 20, 15, 7],
|
||||||
|
[9, 3, 15, 20, 7],
|
||||||
|
stdlib.TreeNode(
|
||||||
|
3,
|
||||||
|
left=stdlib.TreeNode(9),
|
||||||
|
right=stdlib.TreeNode(
|
||||||
|
20, left=stdlib.TreeNode(15), right=stdlib.TreeNode(7)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
[-1],
|
||||||
|
[-1],
|
||||||
|
stdlib.TreeNode(-1),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
[1, 2],
|
||||||
|
[1, 2],
|
||||||
|
stdlib.TreeNode(1, right=stdlib.TreeNode(2)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_binary_tree_from_preorder_inorder(
|
||||||
|
preorder: list[int], inorder: list[int], expected: stdlib.BinaryTreeNode
|
||||||
|
):
|
||||||
|
assert stuff.binary_tree_from_preorder_inorder(preorder, inorder) == expected
|
||||||
|
Loading…
Reference in New Issue
Block a user