"""
Created by Hadron DaVinci
https://hadrondavinci.com

For Educational Purposes
To Run:
    1) Download https://hadrondavinci.com/assets/code/2020-11-21/method1.py
    2) python method1.py

Expected Output:
The sum of all root-to-leaf numbers is: 13997
"""
from typing import Union


class BinaryTreeNode:
    def __init__(self, digit: int, left=None, right=None):
        self.data = digit
        self.left = left
        self.right = right


class BinaryTree:
    def __init__(self, node_list: list, null_char: str = "~") -> None:
        self.null_node_char = null_char
        self.node_list = node_list
        self.index = 0

        self.total_sum = 0
        self.root = self.insert_next_node()

    def insert_next_node(self, number_history: str = '') -> Union[BinaryTreeNode, None]:
        data = self.node_list[self.index]
        temp_node = None
        if data != self.null_node_char:
            number_history += data
            temp_node = BinaryTreeNode(data)
        self.index += 1

        if temp_node:
            temp_node.left = self.insert_next_node(number_history)
            temp_node.right = self.insert_next_node(number_history)

        if self.node_is_leaf(temp_node):
            self.total_sum += int(number_history)
        return temp_node

    @staticmethod
    def node_is_leaf(node: BinaryTreeNode) -> bool:
        if node is None:
            return False
        return (node.left is None) and (node.right is None)


if __name__ == "__main__":
    binary_tree_preorder_data = "6 3 2 ~ ~ 5 7 ~ ~ 4 ~ ~ 5 ~ 4 ~ ~"
    binary_tree_preorder_data = binary_tree_preorder_data.split(' ')
    bt = BinaryTree(binary_tree_preorder_data)
    print("The sum of all root-to-leaf numbers is:", bt.total_sum)
