樹的應(yīng)用舉例——四則計算

計算四則運(yùn)算:

import ninth lesson_Tree

def build_parse_Tree(alist):
    alst = alist.split()
    # 創(chuàng)建一個節(jié)點(diǎn)棧
    astack = []
    res_Tree = BinaryTree('')
    astack.append(res_Tree)
    currentTree = res_Tree

    for i in alst:
        # 如果是'(',則創(chuàng)建左子節(jié)點(diǎn),并把該父節(jié)點(diǎn)記錄入棧,再把指針指向左子節(jié)點(diǎn)
        if i == '(':
            currentTree.insertLeft('')
            astack.append(currentTree)
            currentTree = currentTree.getLeftChildren()
        # 如果是數(shù)字,則給節(jié)點(diǎn)賦值,并把父節(jié)點(diǎn)出棧,再把指針指向父節(jié)點(diǎn)
        elif i is not in ['+', '-', '*', '/']:
            currentTree.setVal(int(i))
            currentTree = astack.pop()
        # 如果是符號,則給節(jié)點(diǎn)賦值符號,并把該節(jié)點(diǎn)入棧,并創(chuàng)建右子節(jié)點(diǎn),再把指針指向右子節(jié)點(diǎn)
        elif i in ['+', '-', '*', '/']:
            currentTree.setVal(i)
            currentTree.insertRight('')
            astack.append(currentTree)
            currentTree = currentTree.getRightChildren()
        # 如果是')',則返回上一節(jié)點(diǎn),即將棧壓出上一節(jié)點(diǎn)
        elif i == ')':
            currentTree = astack.pop()

        else:
            raise ValueError

    return res_Tree

# 遞歸調(diào)用,基本結(jié)束條件為節(jié)點(diǎn)為葉節(jié)點(diǎn),返回葉節(jié)點(diǎn)的值進(jìn)行計算
def evaluate(res_Tree):
    opers = {'+': operator.add(), '-': operator.sub(), '*': operator.mul(), '/': operator.truediv()}

    left = res_Tree.getLeftChildren()
    right = res_Tree.getRightChildren()

    if left and right:
        fn = opers[res_Tree.getRootVal()]
        return fn(evaluate(left),evaluate(right))
    else:
        return res_Tree.getRootVal()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容