def isOperator(text):
    if text == '+' or text == '-' or text == '*' or text == '/':
        return True
    else:
        return False

def createOperatorNode(text, i=0):
    """Returns (node, pointer to remainingTextAfterThisTree)"""
    #breakpoint()
    node = {}

    if not isOperator(text[i]):
        raise Exception('Expected operator, not ' + text.split()[i])
    else:
        node['operator'] = text[i]

    i += 1  # Move the text index past the operator.
    while text[i] == ' ':
        i += 1  # Keep moving the text index until it points to a non-space character (either an operator or number).

    if isOperator(text[i]):
        # RECURSIVE CASE
        node['left'], i = createOperatorNode(text, i) # left child is an operator node
    else:
        node['left'] = int(text[i:].split()[0]) # left child is a number
        i += len(str(node['left']))  # Move the text index past the number.
        while text[i] == ' ':
            i += 1  # Keep moving the text index until it points to a non-space character (either an operator or number).

    if isOperator(text[i]):
        # RECURSIVE CASE
        node['right'], i = createOperatorNode(text, i) # right child is an operator node
    else:
        node['right'] = int(text[i:].split()[0]) # right child is a number
        i += len(str(node['right']))  # Move the text index past the number.
        while i < len(text) and text[i] == ' ':
            i += 1  # Keep moving the text index until it points to a non-space character (either an operator or number).

    # BASE CASE
    return node, i


def solveMathTree(node):
    if type(node['left']) == dict:
        # RECURSIVE CASE
        # Replace the node with the number it solves to.
        node['left'] = solveMathTree(node['left'])
    if type(node['right']) == dict:
        # RECURSIVE CASE
        # Replace the node with the number it solves to.
        node['right'] = solveMathTree(node['right'])

    # BASE CASE
    if node['operator'] == '+':
        return node['left'] + node['right']
    elif node['operator'] == '-':
        return node['left'] - node['right']
    elif node['operator'] == '*':
        return node['left'] * node['right']
    elif node['operator'] == '/':
        return node['left'] / node['right']




root = createOperatorNode('+ 2 * 3 4')[0]
root = createOperatorNode('* + 2 3 4')[0]
print(solveMathTree(root))
