Index
本文稍后补全,推荐阅读:https://blog.csdn.net/weixin_60702024/article/details/141883851
请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出。
例如, 当下列两棵表达式树作为算法的输入时, 输出的等价中缀表达式分别为(a+b)*(c*(-d))和(a*b)+(-(c-d))
。
二叉树结点定义如下:
typedef struct node {
char data[10]; // 存储操作数或操作符
struct node *left, *right;
} BTree;
要求:
1 - 给出算法的基本设计思想。
2 - 根据设计思想,采用C或 C++语言描述算法,关键之处给出注释。
(本文重点关注算法实现及思路分析,不含具体答题表述)
分析实现
对于中缀表达式,与之对应的遍历方式为中序遍历。中序遍历得到的操作数/符序列与中缀表达式中的序列是相对应的,而本题中除了结点中的操作数/符,还需要额外再考虑括号——“通过括号反映操作符的计算次序”。
从示例中可知,本题中的括号满足以下两点:
1 - 根节点对应运算两侧不加括号;
2 - 其余每个操作符对应结点(即非根非叶结点)的运算两侧需要加括号。
根据以上规则,具体实现如下:
// 二叉树转中缀表达式辅助函数
void tree2ExpUtil(BTree *cur, int depth){
if(cur==NULL)
return;
// 特殊处理叶结点
if(cur->left==NULL && cur->right==NULL){
cout<<cur->data;
return;
}
// 1.处理左子树
if(depth>1)
cout<<"(";
tree2ExpUtil(cur->left, depth+1);
// 2.处理当前结点
cout<<cur->data;
// 3.处理右子树
tree2ExpUtil(cur->right, depth+1);
if(depth>1)
cout<<")";
}
// 二叉树转中缀表达式
void tree2Exp(BTree *root){
tree2ExpUtil(root, 1);
}
总结
以上就是通过中序遍历完成二叉树转中缀表达式的实现。
本题重点在于中序遍历,在此基础上,又通过传递当前深度,来判断运算操作是否对应根节点。
标签:结点,中缀,depth,括号,数一,线性代数,014,表达式,cur From: https://blog.csdn.net/weixin_60702024/article/details/142503112