淺談一下四則運(yùn)算和二叉樹
引言
前幾天忽然想到了四則運(yùn)算和二樹有沒有關(guān)系,然后在網(wǎng)絡(luò)上檢索了一下,發(fā)現(xiàn)還真的有四則運(yùn)算和二叉樹。
因?yàn)榭偸且姷桨?四則運(yùn)算表達(dá)式 用 樹 的形式來展示,所以就想著給定一顆表達(dá)式樹,計(jì)算它的結(jié)果出來。
這里是我待會(huì)會(huì)用到的三顆表達(dá)式樹,下面是它的表達(dá)式:
1
1+2
(6/2)+(2*(9-10)
這里我設(shè)計(jì)一個(gè)簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),一個(gè)普通的節(jié)點(diǎn)如下:
一個(gè) root 節(jié)點(diǎn),表示樹的根。然后是下面的子節(jié)點(diǎn)。kind 的類型為 INT、ADD、MIN、MUL 和 DIV。即整數(shù)、+、-、* 和 /。然后是 value,它只有在 kind 為 INT 時(shí)有意義。然后是 left 和 right,左右子節(jié)點(diǎn),如果有的話,就一直這樣遞歸表示下去。
{
"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__":
# 測(cè)試的樹
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
}
}
}
}
}
]
# 計(jì)算
for test_tree in test_trees:
print(computer(test_tree["root"]))
print()
輸出結(jié)果:

這里只是簡(jiǎn)單的嘗試一下,計(jì)算基本是沒有問題的。問題的關(guān)鍵在于把表達(dá)式轉(zhuǎn)成樹的結(jié)構(gòu),我還沒有想好怎么處理,所以我就把后半部分寫出來了。
到此這篇關(guān)于淺談一下四則運(yùn)算和二叉樹的文章就介紹到這了,更多相關(guān)四則運(yùn)算和二叉樹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析Sentry?Relay?二次開發(fā)調(diào)試
這篇文章主要介紹了Sentry?Relay?二次開發(fā)調(diào)試簡(jiǎn)介,集成測(cè)試要求?Redis?和?Kafka?在其默認(rèn)配置中運(yùn)行,獲取所有必需服務(wù)的最便捷方式是通過?sentry?devservices,這需要最新的?Sentry?開發(fā)環(huán)境,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-03-03
Python如何爬取微信公眾號(hào)文章和評(píng)論(基于 Fiddler 抓包分析)
這篇文章主要介紹了Python如何爬取微信公眾號(hào)文章和評(píng)論(基于 Fiddler 抓包分析),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06
Python內(nèi)置函數(shù)—vars的具體使用方法
本篇文章主要介紹了Python內(nèi)置函數(shù)—vars的具體使用方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
python多線程案例之多任務(wù)copy文件完整實(shí)例
這篇文章主要介紹了python多線程案例之多任務(wù)copy文件,結(jié)合完整實(shí)例形式分析了Python使用multiprocessing模塊實(shí)現(xiàn)基于多線程的文件拷貝相關(guān)操作技巧,需要的朋友可以參考下2019-10-10
Python 找出英文單詞列表(list)中最長(zhǎng)單詞鏈
這篇文章主要介紹了Python 找出英文單詞列表(list)中最長(zhǎng)單詞鏈,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

