淺談一下四則運(yùn)算和二叉樹
引言
前幾天忽然想到了四則運(yùn)算和二樹有沒有關(guān)系,然后在網(wǎng)絡(luò)上檢索了一下,發(fā)現(xiàn)還真的有四則運(yùn)算和二叉樹。
因?yàn)榭偸且姷桨?四則運(yùn)算表達(dá)式 用 樹 的形式來展示,所以就想著給定一顆表達(dá)式樹,計(jì)算它的結(jié)果出來。
這里是我待會會用到的三顆表達(dá)式樹,下面是它的表達(dá)式:
1
1+2
(6/2)+(2*(9-10)
這里我設(shè)計(jì)一個(gè)簡單的數(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__": # 測試的樹 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é)果:
這里只是簡單的嘗試一下,計(jì)算基本是沒有問題的。問題的關(guān)鍵在于把表達(dá)式轉(zhuǎn)成樹的結(jié)構(gòu),我還沒有想好怎么處理,所以我就把后半部分寫出來了。
到此這篇關(guān)于淺談一下四則運(yùn)算和二叉樹的文章就介紹到這了,更多相關(guān)四則運(yùn)算和二叉樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基本運(yùn)算幾何運(yùn)算處理數(shù)字圖像示例
這篇文章主要介紹了Python基本運(yùn)算,同個(gè)幾個(gè)幾何運(yùn)算處理數(shù)字圖像示例來為大家詳細(xì)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09python調(diào)用百度API實(shí)現(xiàn)人臉識別
這篇文章主要介紹了python調(diào)用百度API實(shí)現(xiàn)人臉識別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Python使用函數(shù)默認(rèn)值實(shí)現(xiàn)函數(shù)靜態(tài)變量的方法
這篇文章主要介紹了Python使用函數(shù)默認(rèn)值實(shí)現(xiàn)函數(shù)靜態(tài)變量的方法,是很實(shí)用的功能,需要的朋友可以參考下2014-08-08python實(shí)現(xiàn)MySQL指定表增量同步數(shù)據(jù)到clickhouse的腳本
這篇文章主要介紹了python實(shí)現(xiàn)MySQL指定表增量同步數(shù)據(jù)到clickhouse的腳本,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Python實(shí)現(xiàn)JSON反序列化類對象的示例
本篇文章主要介紹了Python實(shí)現(xiàn)JSON反序列化類對象的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01對python_discover方法遍歷所有執(zhí)行的用例詳解
今天小編就為大家分享一篇對python_discover方法遍歷所有執(zhí)行的用例詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02使用NumPy進(jìn)行數(shù)組數(shù)據(jù)處理的示例詳解
NumPy是Python中用于數(shù)值計(jì)算的核心包之一,它提供了大量的高效數(shù)組操作函數(shù)和數(shù)學(xué)函數(shù),可以支持多維數(shù)組和矩陣運(yùn)算。本文主要為大家介紹了NumPy進(jìn)行數(shù)組數(shù)據(jù)處理的具體方法,需要的可以參考一下2023-03-03python pandas 組內(nèi)排序、單組排序、標(biāo)號的實(shí)例
下面小編就為大家分享一篇python pandas 組內(nèi)排序、單組排序、標(biāo)號的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04