浅谈一下四则运算和二叉树
作者:CrazyDragon_King 发布时间:2021-12-27 10:10:34
标签:四则,运算,二叉树
引言
前几天忽然想到了四则运算和二树有没有关系,然后在网络上检索了一下,发现还真的有四则运算和二叉树。
因为总是见到把 四则运算表达式 用 树 的形式来展示,所以就想着给定一颗表达式树,计算它的结果出来。
这里是我待会会用到的三颗表达式树,下面是它的表达式:
1
1+2
(6/2)+(2*(9-10)
这里我设计一个简单的数据结构,一个普通的节点如下:
一个 root 节点,表示树的根。然后是下面的子节点。kind 的类型为 INT、ADD、MIN、MUL 和 DIV。即整数、+、-、* 和 /。然后是 value,它只有在 kind 为 INT 时有意义。然后是 left 和 right,左右子节点,如果有的话,就一直这样递归表示下去。
{
"root": {
"kind": "INT",
"value": 1
}
},
{
"root": {
"kind": "ADD",
"value": "+",
"left": {
"kind": "INT",
"value": 1
},
"right": {
"kind": "INT",
"value": 2
}
}
},
from typing import Dict, Union
def computer(tree: Dict[str, Union[str, int, Dict[str, int]]]) -> int:
if not tree:
return 0
kind = tree.get("kind")
value = tree.get("value")
print(f"{kind} ==> {value}")
if kind == 'INT':
return value # type: ignore
left_val = computer(tree.get("left")) # type: ignore
right_val = computer(tree.get("right")) # type: ignore
if kind == 'ADD':
return left_val + right_val
elif kind == 'MIN':
return left_val - right_val
elif kind == 'MUL':
return left_val * right_val
elif kind == 'DIV':
return left_val // right_val
else:
print(type)
raise Exception("unexcepted operator")
if __name__ == "__main__":
# 测试的树
test_trees = [
{
"root": {
"kind": "INT",
"value": 1
}
},
{
"root": {
"kind": "ADD",
"value": "+",
"left": {
"kind": "INT",
"value": 1
},
"right": {
"kind": "INT",
"value": 2
}
}
},
{
"root": {
"kind": "ADD",
"value": "+",
"left": {
"kind": "DIV",
"value": "/",
"left": {
"kind": "INT",
"value": 6
},
"right": {
"kind": "INT",
"value": 2
}
},
"right": {
"kind": "MUL",
"value": "*",
"left": {
"kind": "INT",
"value": 2
},
"right": {
"kind": "MIN",
"value": "-",
"left": {
"kind": "INT",
"value": 9
},
"right": {
"kind": "INT",
"value": 10
}
}
}
}
}
]
# 计算
for test_tree in test_trees:
print(computer(test_tree["root"]))
print()
输出结果:
这里只是简单的尝试一下,计算基本是没有问题的。问题的关键在于把表达式转成树的结构,我还没有想好怎么处理,所以我就把后半部分写出来了。
来源:https://blog.csdn.net/qq_40734247/article/details/128107562


猜你喜欢
- 楔子当有多个 IO 密集型的任务要被处理时,我们自然而然会想到多线程。但如果任务非常多,我们不可能每一个任务都启动一个线程去处理,这个时候最
- 根据 homebrew-brew 官方的解释得知,MongoDB 不再是开源的了,并且已经从 Homebrew中移除 #43770正是由于
- 问题描述我在flask程序中,启动了另一个python程序-test.py:os.system('nohup python /opt
- 使用了telnetlib模块,首先登录到交换机,列出并获取配置文件的名称,然后通过tftp协议将配置文件传输到文件服务器上,为避免配置文件覆
- 0.摘要在Python中,尤其是数组当中,对于一些异常值往往需要进行特殊处理。为了防止异常值与正常数据混淆,影响最终计算结果,常用的方法是将
- 我们先看一下浅复制的缺陷,不知多少人中过招呢? var oOriginal = { memNum: 1, // number memStr:
- union all在MySQL5.6下的表现Part1:MySQL5.6.25[root@HE1 ~]# MySQL -uroot -pEn
- vue单页开发时经常需要父子组件之间传值,自己用过但是不是很熟练,这里我抽空整理了一下思路,写写自己的总结。GitHub地址:https:/
- 学会了FSO提取文件值,也学会了将信息输入到文件中,那下面就再来应用应用下。不知道你有没有这样的习惯:看到一个文件,不自觉的右键选择用记事本
- 前言不同于Linux服务器上的命令行操作,在windows系统上用户的使用习惯还是倾向于使用有界面的工具。如果工具是命令行交互操作的方式,可
- 本文实例讲述了PHP实现的AES双向加密解密功能。分享给大家供大家参考,具体如下:<?php/* * Created on 2018-
- 在python列表中,如果我们想要删除一个或者连续几个元素,可以使用del()方法,在numpy数组,如果想要删除元素,可以使用numpy.
- 本文实例讲述了Python异常处理操作。分享给大家供大家参考,具体如下:一、异常处理的引入>>>whileTrue:try
- django路由和视图要了解django是如何运行的,首先要了解路由和视图两个概念,然后我们在项目中添加一些简单的路由和视图路由和视图的概念
- 昨天晚上睡觉前突然想到的,在此记一笔。传统方式以前我们做文章系统或新闻发布系统的时候,做文章内链(标签)的时候,通常是通过以下方式来实现的:
- 如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以了, 但是众多线程,可怎么找到引起死锁的线程
- 最近发现一个问题,是关于IDEA的一些骚操作的事儿~具体怎么回事,一起来看看。我们都知道使用git分布式版本控制工具,提、拉 代码都会有一个
- F.conv2d pytorch卷积计算Pytorch里一般小写的都是函数式的接口,相应的大写的是类式接口。函数式的更加low-level一
- on和where的区别多表查询语法结构:table_reference {[INNER] JOIN | {LEFT|RIGHT} [OUTE
- /* 全选择*/ function SB002SelectAll() { var table = document.getElementBy