给出一个表达式树,输出其中序表达式,需要用括号来区分优先顺序(貌似是408真题,感觉自己递归没有学好,只会用栈实现,也不知道对不对,求大神纠错)
如图所给出表达式,输出为(a+(b*(-d)-(e/f))
- 算法分析
(一)若当前结点是左子树上的叶子结点,输出左括号以及数据
(二)若当前结点是根节点直接输出数据
(三)若当前结点有右子树但左子树为空,则输出左括号以及根节点数据
(四)若当前结点为右子树上的叶节点,输出右括号以及数据
- 代码实现
//非递归中序遍历思想
void print(Bitree T){
if(!T) return ;//树为空退出函数
Stack s; //声明一个栈
BiTNode *p=T;
int flag=1; //判断当前在左或右子树的标志
print('(');
while(p||!IsEmpty(s)){ //当前结点不为空或者栈不为空
if(p){
push(s,p); //左子树不空,继续遍历左子树
p=p->lchild;
flag=1; //标志当前遍历的是左子树
}
else{ // 左到底了
pop(s,p);//出栈;
if((!p->lchild&&!p->rchild&&flag))||(!p->lchild&&p->rchild)){//第一种及第四种情况
print('(');
print(p->data);
}
else if(p->lchild&&p->rchild)//第二种情况
print(p->data);
else if(!flag){//第三种情况
print(')');
print(p->data);
}
p=p->rchild;//判断后往右走
flag=0;
}//while
print(')');
}//print