If only one input tree has a node in a given position, the corresponding node
in the new tree should match that input node.
"""
from data_structures.binary_tree import BinaryTree


def merge_binary_trees(b1: BinaryTree, b2: BinaryTree) -> BinaryTree:
    if b1 and b2:
        root = BinaryTree(b1.value + b2.value)
        root.left = merge_binary_trees(b1.left, b2.left)
        root.right = merge_binary_trees(b1.right, b2.right)
        return root
    else:
        return b1 or b2


if __name__ == '__main__':
    tree1 = BinaryTree(3)
    tree1.left = BinaryTree(2)
    tree1.right = BinaryTree(1)
    tree1.display()

    tree2 = BinaryTree(5)
    tree2.left = BinaryTree(3)
    tree2.right = BinaryTree(2)
    tree2.right.right = BinaryTree(1)
    tree2.display()

    merged_tree = merge_binary_trees(tree1, tree2)
    merged_tree.display()
Example #2
0
    return _deserialize_binary_tree(ast.literal_eval(serialized_tree))


def _deserialize_binary_tree(serialized_tree: List[Any]) -> BinaryTree:
    current_value = serialized_tree.pop(0)
    if current_value:
        root = BinaryTree(current_value)
        root.left = _deserialize_binary_tree(serialized_tree)
        root.right = _deserialize_binary_tree(serialized_tree)
        return root


if __name__ == '__main__':
    root = BinaryTree(6)
    root.left = BinaryTree(4)
    root.left.left = BinaryTree(2)
    root.left.left.left = BinaryTree(1)
    root.left.left.right = BinaryTree(3)
    root.left.right = BinaryTree(5)
    root.right = BinaryTree(9)
    root.right.left = BinaryTree(7)
    root.right.left.right = BinaryTree(8)
    root.right.right = BinaryTree(10)
    root.display()

    serialized_binary_tree = serialize_binary_tree(root)
    print(serialized_binary_tree)

    root = deserialize_binary_tree(serialized_binary_tree)
    root.display()