zoukankan      html  css  js  c++  java
  • 07_2.二叉数,二叉树的简单应用:表达式树

    """
    二叉树的list实现
    """
    
    
    def BinTree(data, left=None, right=None):
        """
        二叉树
        :param data: 根结点的元素
        :param left: 左子树元素
        :param right: 右子树元素
        :return:
        """
        return [data, left, right]
    
    
    def is_empty_BinTree(btree):
        return btree is None
    
    
    def root(btree):
        return btree[0]
    
    
    def left(btree):
        return btree[1]
    
    
    def right(btree):
        return btree[2]
    
    
    def set_root(btree, data):
        btree[0] = data
    
    
    def set_left(btree, left):
        btree[1] = left
    
    
    def set_right(btree, right):
        btree[2] = right
    
    
    if __name__ == '__main__':
        t1 = BinTree(2, BinTree(4), BinTree(8))
        print(t1)  # [2, [4, None, None], [8, None, None]]

    二叉树的简单应用:表达式树:

    """二叉树的简单应用:表达式树"""
    
    
    # 表达式构造函数
    def make_sum(a, b):
        return ('+', a, b)
    
    
    def make_prod(a, b):
        return ('*', a, b)
    
    
    def make_diff(a, b):
        return ('-', a, b)
    
    
    def make_div(a, b):
        return ('/', a, b)
    
    
    # 是否是基本表达式,也就是数或者变量
    def is_basic_exp(a):
        return not isinstance(a, tuple)
    
    
    # 判断是否是数值
    def is_number(x):
        return isinstance(x, int) or isinstance(x, float) or isinstance(x, complex)
    
    
    def eval_sum(a, b):
        if is_number(a) and is_number(b):
            return a + b
        if is_number(a) and a == 0:
            return b
        if is_number(b) and b == 0:
            return a
        return make_sum(a, b)
    
    
    def eval_div(a, b):
        if is_number(a) and is_number(b):
            return a / b
        if is_number(a) and a == 0:
            return 0
        if is_number(b) and b == 1:
            return a
        if is_number(b) and b == 0:
            raise ZeroDivisionError
        return make_div(a, b)
    
    
    def eval_diff(a, b):
        if is_number(a) and is_number(b):
            return a * b
        if is_number(a) and a == 0:
            return 0
        if is_number(b) and b == 1:
            return a
        if is_number(a) and a == 1:
            return b
        if is_number(b) and b == 0:
            return 0
        return make_diff(a, b)
    
    
    def eval_prod(a, b):
        if is_number(a) and is_number(b):
            return a - b
        if is_number(a) and a == 0:
            return -b
        if is_number(b) and b == 0:
            return a
        return make_prod(a, b)
    
    
    def eval_exp(e):
        if is_basic_exp(e):
            return e
        # 递归处理子表达式
        op, a, b = e[0], eval_exp(e[1]), eval_exp(e[2])
        if op == '+':
            return eval_sum(a, b)
        elif op == '*':
            return eval_diff(a, b)
        elif op == '-':
            return eval_prod(a, b)
        elif op == '/':
            return eval_div(a, b)
        else:
            raise ValueError("Unknown operator:", op)
    
    
    el = make_prod(3, make_sum(2, 5))
    
    print(el)  # ('*', 3, ('+', 2, 5))
    print(eval_exp(el))  # 21
    
    el1 = make_prod(3, make_sum(-2, 5))
    
    print(el1)  # ('*', 3, ('+', -2, 5))
    print(eval_exp(el1))  # 9
  • 相关阅读:
    Android application context/activity context与内存泄露(转)
    Android Slide Menu相关
    android 实现自定义卫星菜单
    关于引用Theme.AppCompat theme的报错问题
    java中volatile关键字的含义
    自定义控件其实很简单1/3
    Android 修改应用程序字体
    Android字体工作原理
    颜色渐变的算法
    Android系统下载管理DownloadManager功能介绍及使用示例
  • 原文地址:https://www.cnblogs.com/fly-book/p/11746621.html
Copyright © 2011-2022 走看看