一、实验目的
1.掌握使用VC++或VS2012上机调试线性表的基本方法;
2.掌握二叉树的运算在链式存储结构上的实现。
3.了解二叉树的特点,理解先序中序后序的递归及非递归算法。
4.掌握二叉树的应用。
二、实验内容
请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出。
注意:
- 树中至少包含一个运算符。
- 当运算符是负号时,左儿子为空,右儿子为需要取反的表达式。
- 树中所有叶节点的值均为非负整数。
例如,当下列两棵表达式树作为算法的输入时:
输出的等价中缀表达式分别为(a+b)*(c*(-d))
和(a*b)+(-(c-d))
。
三、代码
废话少说,上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//树节点的结构
struct TreeNode {
char data;
struct TreeNode* left;
struct TreeNode* right;
};
//创建新的树节点
struct TreeNode* createNode(char data) {
struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
//将树转换为中缀表达式并输出
void convert(struct TreeNode* root) {
if (root == NULL) {
return;
}
if (root->left != NULL || root->right != NULL) {
printf("(");
}
convert(root->left);
printf("%c", root->data);
convert(root->right);
if (root->left != NULL || root->right != NULL) {
printf(")");
}
}
int main() {
//构建一个给定的树
/*
+
/ \
* -
/ \ / \
A B C D
*/
struct TreeNode* root = createNode('+');
root->left = createNode('*');
root->left->left = createNode('A');
root->left->right = createNode('B');
root->right = createNode('-');
root->right->left = createNode('C');
root->right->right = createNode('D');
//将树转换为中缀表达式并输出
convert(root);
printf("\n");
return 0;
}
运行,输出:
((A*B)+(C-D))
上述代码中,我们首先定义了一个表达式树的结构,包含数据和左右子节点。然后,我们使用createNode函数创建了一个给定的表达式树。最后,我们使用convert函数将表达式树转换为中缀表达式,并输出结果。在输出中,我们使用括号来反映操作符的计算次序。
这个题不算难,我写的也很简单。朋友,希望它对你有一点帮助。