根据中缀二叉树构建中缀表达式
请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反应操作符的计算次序)并输出,例如,当下列两棵表达式树作为算法的输入时:
输出的等价表达式分别为(a+b)*(c*(-d))和(a*b)+(-(c-d))。
二叉树结点定义如下:
typedef char TElemType[10] ; //存储操作数或操作符
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
要求:实现该算法。
解题思路:
中缀二叉树中,叶子节点都是操作数,内部节点都是操作符,所以当遇到操作符时,在外层加上左右括号,并递归向孩子节点,当遇到叶子节点(操作数节点)时,直接输出节点值。
ps:由于最外层不用加括号,所以需要判断是否为根节点(isRoot函数)
Status isRoot(BiTree T)
{
if(T == root)
return TRUE;
}
void InOrderTraverse(BiTree T)
{
if(!T)
return;
if(T->lchild || T->rchild)
{
if(!isRoot(T))
printf("(");
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
if(!isRoot(T))
printf(")");
}
else
{
printf("%c",T->data);
}
}