题目要求:(点击图片查看)
问题:根据前序序列建立表达式树并计算输出
第一步:根据所给前序序列建立表达式树;
第二步:输出表达式;
第三步:计算表达式树
源码与注释:
#include <bits/stdc++.h> //#include <iostream> //#include <stdio.h> using namespace std; string s; typedef struct Node{ int data; struct Node* left; struct Node* right; }Node; void Build(Node* &tree){//建立二叉树 cin>>s; int i=0,sn=0,len=0; if(s[0]=='#') tree=NULL; //空叶子 else{ //节点操作判断 if(s[0]=='+') sn=-1; else if(s[0]=='-') sn=-2; else if(s[0]=='*') sn=-3; else if(s[0]=='/') sn=-4; else{ //叶子节点操作数计算 len=s.size(); //printf("%d ",len); //输出字符串s的长度 while(i<len){ sn=sn*10+(s[i]-'0'); i++; } } tree=new Node; tree->data=sn; Build(tree->left); //递归建立左子树 Build(tree->right); //递归建立右子树 } } void Print_Tree(Node* tree){ //打印表达式 if(tree){ if(tree->data>=0) printf("%d",tree->data); //如果遇到叶子节点直接输出 else{ printf("("); //打印左括号 Print_Tree(tree->left); //打印左子树 if(tree->data==-1) printf("+"); //打印操作符 else if(tree->data==-2) printf("-"); else if(tree->data==-3) printf("*"); else if(tree->data==-4) printf("/"); Print_Tree(tree->right); //打印右子树 printf(")"); //打印右括号 } } } int Cal_Tree(Node* tree){ //计算表达式树 if(tree){ if(tree->data>=0){ return tree->data; } else{ int sn=Cal_Tree(tree->left); if(tree->data==-1){ return sn + Cal_Tree(tree->right); } else if(tree->data==-2){ return sn-Cal_Tree(tree->right); } else if(tree->data==-3){ return sn * Cal_Tree(tree->right); } else if(tree->data==-4){ return sn / Cal_Tree(tree->right); } } } } int main() { //char ch; while(cin>>s) //输入string字符串,默认空格结束 { //cout<<s; int i=0,sn=0,len=0; if(s[0]=='+') sn=-1; //操作符判断 else if(s[0]=='-') sn=-2; else if(s[0]=='*') sn=-3; else if(s[0]=='/') sn=-4; else{ //操作数判断 len=s.size(); //printf("%d ",len); while(i<len){ sn=sn*10+(s[i]-'0'); i++; } } Node* tree=new Node; tree->data=sn; //叶子节点 Build(tree->left); //递归建立左子树 Build(tree->right); //递归建立右子树 Print_Tree(tree); //打印表达式 sn=Cal_Tree(tree); //计算表达式树 printf("=%d",sn); printf(" "); //输出空行 } return 0; }