1)二叉树仅含二元运算符,存储在二叉树BT中,写出计算该算术表达式的值的算法。
#include "stdafx.h" #include<iostream> using namespace std; typedef struct BTreeNode { float data; char optr; struct BTreeNode *lchild,*rchild; }BiNode,*BTree; int _tmain(int argc, _TCHAR* argv[]) { return 0; } float PostEval(BTree bt)//后序遍历 { float lv,rv;//左右表达式的值; float value;//最终值 if(bt) { lv=PostEval(bt->lchild); rv=PostEval(bt->rchild); switch(bt->optr) { case '+':value=lv+rv;break; case '-':value=lv-rv;break; case '*':value=lv*rv;break; case '/':value=lv/rv;break; } } return value; }
2)给出算法将二叉树表示的表达式二叉树按中缀表达式输出,并加上相应的括号
#include "stdafx.h" #include<iostream> using namespace std; typedef struct BTreeNode { float data; char optr; struct BTreeNode *lchild,*rchild; }BTree; int _tmain(int argc, _TCHAR* argv[]) { return 0; } int Precede(char optr1,char optr2)//比较运算符级别高低,optr1高于optr2时返回1,相等时返回0,低于时返回-1 { switch(optr1) { case '+':case'-':if(optr1=='+'||optr2=='-')return 0;else return -1; case '*':case'/':if(optr1=='*'||optr2=='/')return 0;else return 1; } } void InorderExp(BTree *bt)//输出二叉树的表达式 { float lv,rv;//左右表达式的值; float value;//最终值 int bracket; if(bt) { if(bt->lchild) { bracket=Precede(bt->data,bt->lchild->data);//比较双亲与左子女运算符优先级 if(bracket==1)cout<<'('; InorderExp(bt->lchild);//输出左子女的算术表达式 if(bracket==1)cout<<')'; } cout<<bt->data;//输出根结点 if(bt->rchild) { bracket=Precede(bt->data,bt->rchild->data);//比较双亲与右子女运算符优先级 if(bracket==1)cout<<'('; InorderExp(bt->rchild);//输出右子女的算术表达式 if(bracket==1)cout<<')'; } } }