请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反应操作符的计算次序)并输出,例如,当下列两棵表达式树作为算法的输入时:
输出的等价表达式分别为(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);}
}