码迷,mamicode.com
首页 > 其他好文 > 详细

07_2.二叉数,二叉树的简单应用:表达式树

时间:2019-10-27 10:19:00      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:就是   nbsp   简单应用   none   基本   return   树元素   eva   实现   

"""
二叉树的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

 

07_2.二叉数,二叉树的简单应用:表达式树

标签:就是   nbsp   简单应用   none   基本   return   树元素   eva   实现   

原文地址:https://www.cnblogs.com/fly-book/p/11746621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!