分析與總結
問題描述 :
內容:(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...