python二叉树表达式求值问题

Posted by 昆山吴彦祖 on 2017.12.19
#二叉树 表达式求值问题
#输入二叉树后序表达式如 78+5/23*-,将他转化为二叉树并进行求值
class Node:
    '节点类'
    def __init__(self,value = -1):
        self.value = value
        self.lchild = None
        self.rchild = None

class Tree:
    '树类'
    def __init__(self):
        self.root = None

    def add(self,expression):
        nodes = []
        for i in expression:
            if 57 >= ord(i) >= 49:
                node = Node(i)
                nodes.append(node)
            else:
                node = Node(i)
                node.rchild = nodes.pop()
                node.lchild = nodes.pop()
                nodes.append(node)
        self.root = nodes.pop()

    # 二叉树表达式求值
    def evaluation(self, node=None):
        # 递归解决
        if node == None:
            node = self.root

        if 57 >= ord(node.value) >= 49:
            return node.value

        a = int(self.evaluation(node.lchild))
        b = int(self.evaluation(node.rchild))
        c = node.value
        if c == '*':
            return a * b
        elif c == '/':
            return a / b
        elif c == '+':
            return a + b
        elif c == '-':
            return a - b

    #插入直接求值
    def add_evaluation(self, expression):
        nodes = []
        for i in expression:
            if 57 >= ord(i) >= 49:
                node = Node(i)
                nodes.append(node)
            else:
                node = Node(i)
                a = int(nodes.pop().value)
                b = int(nodes.pop().value)
                if i == '*':
                    node.value = b * a
                elif i == '/':
                    node.value = b / a
                elif i == '+':
                    node.value = b + a
                elif i == '-':
                    node.value = b - a
                nodes.append(node)
        return node.value


if __name__ == '__main__':
    '主函数'
    expression = '78+5/23*-'
    my_tree = Tree()
    #直接求值
    print(my_tree.add_evaluation(expression))
    # 先录入再求值
    # my_tree.add(expression)
    # print(my_tree.evaluation())


二叉树