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

Posted fly-book

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于07_2.二叉数,二叉树的简单应用:表达式树的主要内容,如果未能解决你的问题,请参考以下文章

树二叉树存储结构二叉数遍历& 数据结构基本概念和术语

树二叉树存储结构二叉数遍历& 数据结构基本概念和术语

“树”总结篇

⭐算法入门⭐《二叉树 - 二叉搜索树》简单07 —— LeetCode 530. 二叉搜索树的最小绝对差

二叉树的遍历算法

使用非递归函数和递归函数分别实现二叉数的前序丶中序丶后序遍历