[題目分析] 本題是將符號算術表達式用二叉樹表示的逆問題即將二叉樹表示的表達式還原成原表達式二叉樹的中序遍歷序列與原算術表達式基本相同差別僅在於二叉樹表示中消除了括號將中序序列加上括號就恢復原貌當根結點運算符優先級高於左子樹(或右子樹)根結點運算符時就需要加括號
int Precede(char optroptr)
// 比較運算符級別高低optr級別高於optr時返回相等時返回低於時返回
{switch(optr)
{case+:case:if(optr==+||optr==)return();else return();
case*:case/:if(optr==*||optr==/)return();else return();
} }
void InorderExp (BiTree bt)
//輸出二叉樹表示的算術表達式設二叉樹的數據域是運算符或變量名
{int bracket;
if(bt)
{if(bt>lchild!=null)
{bracket=Precede(bt>databt>lchild>data)//比較雙親與左子女運算符優先級
if(bracket==) printf(()
InorderExp(bt>lchild); //輸出左子女表示的算術表達式
if(bracket==)printf()) //加上右括號
}
printf(bt>data); //輸出根結點
if(bt>rchild!=null) //輸出右子樹表示的算術表達式
{bracket=Precede(bt>databt>rchild>data)
if (bracket==)printf(() //右子女級別低加括號
InorderExp (bt>rchild);
if(bracket==)printf())
} }
}//結束Inorder Exp
[] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/sjjg/201311/23732.html