数据结构学习~13.遍历二叉树的四个应用案例
本文是上一篇文章的后续,详情点击该链接~
案例1
表达式(a-(b+c))*(d/e)存储在图下的一颗二叉树当中(二叉树的data域中是字符型)。编写程序求出该表达式。
做此题之前,可以在我上一篇文章里面,把素材复制过来。
代码实现
我们先写一个运算函数,方便下面使用(该代码曾出现在 09.顺序栈和链栈的应用~ 中)
int operation(int a, char op, int b) {
if (op == '+') return a + b;
if (op == '-') return a - b;
if (op == '*') return a * b;
if (op == '/') {
//被除数不能为0!
if (b == 0) {
printf("error");
return 0;
}
else {
return a / b;
}
}
}
遍历实现
int comp(Tree *p) {
int A, B;
if (p != NULL) {
//如果说这个结点,它的左子树和右子树都不是空。那么就用后序遍历求值
if (p ->left != NULL && p->right != NULL) {
//后序遍历求出左子树的值,赋值给A
A = comp(p->left);
//后序遍历求出右子树的值,赋值给B
B = comp(p->right);
//返回运算结果
return operation(A, p->data,B);
}
else {
//如果当前左右子树为空,则为数值,直接返回
return p->data - '0';
}
}
else {
//如果是空树,直接返回-1
return -1;
}
}
构建图中的二叉树,进行测试。设A = 3,B=4,C=5,D=6,E=2
int main(int argc, char* argv[]) {
//根据图中的样式构建一颗二叉树
//设A = 3,B=4,C=5,D=6,E=2
char A = '3', B = '4', C = '5', D = '6', E = '2';
Tree* tree = (Tree*)malloc(sizeof(Tree));
tree = getTree('*');
tree->left = getTree('-');
tree->left->left = getTree(A);
tree->left->right = getTree('+');
tree->left->right->left = getTree(B);
tree->left->right->right = getTree(C);
tree->right = getTree('/');
tree->right->left = getTree(D);
tree->right->right = getTree(E);
//开始运算
int n = comp(tree);
//测试是否成功
printf("(3-(4+5))*(6/2) = %d\n", (3 - (4