二叉樹 表示式二叉樹轉換成中綴式(括弧處理)

2021-10-11 16:53:19 字數 2370 閱讀 9125

分析與總結

問題描述 :

內容:(1)請參照鍊錶的adt模板,設計二叉樹並逐步完善的抽象資料型別。(由於該環境目前僅支援單檔案的編譯,故將所有內容都集中在乙個原始檔內。在實際的設計中,推薦將抽象類及對應的派生類分別放在單獨的標頭檔案中。參考教材、課件,以及網盤中的鍊錶adt原型檔案,自行設計二叉樹的adt。)

注意:二叉樹adt的基本操作的演算法設計很多要用到遞迴的程式設計方法。

(2)adt的簡單應用:使用該adt設計並實現若干應用二叉樹的演算法設計。

應用:要求設計乙個演算法,將表示式二叉樹轉換成原始的中綴表示式(括號恢復)。二叉樹的儲存結構的建立參見二叉樹應用1。

注意:假定輸入的中綴表示式為合法的表示式。僅考慮有小括弧的場合。運算子包括+、-、*、/,運算數為整數(不侷限於個位數)。

(1)表示式二叉樹轉換成中綴式 (外殼部分,使用者函式)

//表示式二叉樹轉換成中綴式

template

<

class

elemtype

>

void

bianrytree_infix

(binarytree

&t, string &inffix)

;//inffix:轉換獲得的中綴表示式字串

(2)表示式二叉樹轉換成中綴式 (遞迴部分,使用者函式)

//表示式二叉樹轉換中綴表示式

template

<

class

elemtype

>

void

bianrytree_infix_cursive

(binarytreenode

*root, string &inffix)

;

輔助函式:

(1)判斷是否為運算子(使用者函式)

//判斷是否為運算子  

bool

isoperator

(char op )

}

(2)求運算子的優先順序(使用者函式)

//求運算子的優先順序

intgetoperpri

(char op)

}

輸入說明 :

第一行:表示無孩子或指標為空的特殊分隔符

第二行:二叉樹的先序序列(結點元素之間以空格分隔)

輸出說明 :

第一行:中綴表示式字串(不帶空格)

輸入範例 :

#

* - + + 12 # # 14 # # 3 # # / 400 # # / 30 # # * 10 # # 5 # # 62 # #

輸出範例 :
(12+14+3-400/(30/(10*5)))*62
思路分析

效果如下

實際答案

**實現

bool

inorderrur

(binarytreenode *root,

bool

(*visit)

(binarytreenode *temp))if

(isoperator

(left)

&&getoperpri

(left)

<

getoperpri

(temp)

)else

visit2

(root);if

(isoperator

(right)

&&getoperpri

(right)

<

getoperpri

(temp)

)elseif(

(temp ==

'-'&&

isoperator

(right))&&

(getoperpri

(temp)

>=

getoperpri

(right)))

else

if(temp ==

'/'&&

isoperator

(right)

)else

return

true;}

return

false

;}

事故現場

第一次提交

分析與總結

二叉樹計算中綴表示式

看到 資料結構 思想與實現 這本書裡5.3的程式 給出的程式是有問題的 敲到vs中,發現右閉括號不能起到作用,例如 輸入 3 5 7,輸出則是38,右閉括號沒有起到作用。自己調了很久,終於修改對了,下面是正確的 include using namespace std class calc struc...

中綴表示式轉二叉樹

關於中綴表示式轉二叉樹,其實很簡單,只要記住這幾句話就夠了 就這麼簡單 這樣說可能還有人聽不懂 舉個栗子 a b c d e fa b c d e f a b c d e f從左到右遍歷表示式,找到最後計算的字元 分成3部分 a b c d e f 分為左子樹,根,右子樹 再繼續把每個拆分成三部分,...

中綴表示式生成二叉樹

中綴表示式生成二叉樹,大概應該有遞規,迭代,和編譯原理中的自頂向下的 分析法等。遞規,迭代的思路每次讀出乙個數字,乙個運算子,比較當前運算子和之前符號的優先順序,進行相關的操作。自頂向下的 分析法,做了下,實在忘記的差不多了,先占個位。以後完成。tree.c include head.h struc...